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 过程宏
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