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