#macro-derive #struct #derive-builder #traits #options #super #structbuilder

structbuilder_derive

用于为你的结构体派生一个构建器特质的超简单宏

4个版本

0.2.1 2020年3月16日
0.2.0 2020年3月11日
0.1.1 2020年3月10日
0.1.0 2020年3月5日

#681 in 过程宏

MIT 许可证

14KB
235

structbuilder_derive — 最新版本

这是一个简单的rust-lang宏,用于为你的结构体派生一个_Builder特质。这个特质允许你以模块化的方式构建结构体,并提供对成员的只读引用访问。

用法

在Cargo.toml中添加crate作为依赖项

[dependencies]
structbuilder_derive = "0.2.1"

简单地导入派生器,并添加以下derive(StructBuilder)指令

use structbuilder_derive::*;

#[derive(StructBuilder)]
pub struct MyStruct {
    name: String,
    age: usize,
    partner_name: Option<String>
}

这将创建一个<StructName>Builder(例如MyStructBuilder)特质,它提供了一个::new(...)方法,它接受每个非Option字段作为参数来创建基本结构体。还包括实例方法<field_name>(),它返回对称为<field_name>字段的引用,以及每个字段的with_<field_name>(...),它将<field_name>的值设置为提供的值。例如

<assuming MyStruct as defined above>

fn main() {
    let name = String::from("Reid");
    let age = 24;
    let s = MyStruct::new(name, age);

    println!("{}", s.age()); // -> 24
    println!("{:?}", s.partner_name()); // -> None

    let s2 = MyStruct::new(String::from("Jack"), 21).with_partner_name(String::from("Sally"));

    println!("{}", s2.age()); // -> 21
    println!("{:?}", s.partner_name()); // -> Some("Sally")

}

该派生器还提供了驼峰命名法的字段以及蛇形访问器和设置器;这在处理JSON和serde时很方便,例如,外部资源可能提供类似以下的数据形状:{"userId": 12, "userName": "f.mal"};您可以定义您的结构体以匹配此形状,并允许serde序列化和反序列化此结构,同时允许您的代码使用Rust相关的.user_id().with_user_name(...)

特性

  • new(..) 方法用于非 Option 字段
  • 每个声明的字段的只读、借用访问器方法
  • with_<field_name>(..) 构建器方法消耗并返回每个字段的 self
  • 支持 Option<T> 类型
    • 未在 new(..) 方法中提供
    • 如果 <field>: Option<T>,则 with_<field> 接受一个 T 参数
  • 支持泛型和生命周期

注意和警告

  • 仅支持命名结构体。
    • struct X(...) 将被拒绝
  • Option 类型的分析是投机性的。在您的结构体中使用任何名为 Option 的类型将导致宏将其视为 std::option::Option
  • 肯定不是生产就绪的。
  • 生命周期名称 '__sbderive 在访问器方法中内部使用;尝试使用此生命周期将导致名称冲突。

依赖项

~1.5MB
~35K SLoC