16 个版本
0.5.1 | 2022 年 9 月 9 日 |
---|---|
0.5.0 | 2021 年 11 月 4 日 |
0.4.2 | 2021 年 3 月 3 日 |
0.3.0 | 2020 年 9 月 3 日 |
0.1.1 | 2020 年 4 月 30 日 |
#2030 在 Rust 模式
32,383 每月下载量
在 19 个 包中使用 (直接使用 8 个)
27KB
488 行
Rust 的基于意见和选项的构建器模式宏
动机
用于支持 Rust 构建器模式的 derive 宏
- 除了需要
Option<> 字段和显式定义的
default 属性之外,一切都需要,因此不需要任何额外的属性来指示它,并且所需的参数的存在会在编译时(而不是在运行时)进行检查。
- 要创建新的结构体实例,可以使用
::new
和一个仅包含所需字段的辅助初始化结构体定义(以补偿 Rust 命名参数无法使用的问题)。
用法
将以下内容添加到您的 Cargo.toml
[dependencies]
rsb_derive = "0.4"
该宏为您的结构体生成以下函数和实例
with/without/opt_<field_name>
: 字段的不可变设置器(opt
是用于Option<>
输入参数的附加设置器)<field_name>/reset/mopt_<field_name>
: 字段的可变设置器(mopt
是用于Option<>
输入参数的附加设置器)new
: 带有必需字段参数的工厂方法从<>
一个只包含必需字段的辅助初始化结构定义实例。生成的初始化结构为<您的结构名称>Init
。因此,您可以从中使用from(...)
或into()
函数。
在您的结构上标记derive属性
// Import it
use rsb_derive::Builder;
// And use it on your structs
#[derive(Clone,Builder)]
struct MyStructure {
pub req_field1: String,
pub req_field2: i32,
pub opt_field1: Option<String>,
pub opt_field2: Option<i32>
}
在您的结构上使用builder模式
// Creating instances
// Option #1:
let s1 : MyStructure = MyStructure::new(
"hey".into(),
0);
// Option #2 (named arguments emulation):
let s2 : MyStructure = MyStructureInit {
req_field1 : "hey".into(),
req_field2 : 0
}.into();
// Working with instances
let updated =
s1.clone()
.with_opt_field1("hey".into()) // for Option<> fields you specify a bare argument
.without_opt_field2() // you can reset Option<> if you need it
.opt_opt_field1(Some(("hey".into())) // you can use opt_<field> to provide Option<> inputs
.with_req_field2(10); // you can update required params as well
// All together example
let s1 : MyStructure =
MyStructure::from(
MyStructureInit {
req_field1 : "hey".into(),
req_field2 : 0
}
)
.with_opt_field1("hey".into())
.with_opt_field2(10);
// Mutable example (in case you really need it)
let mut s1 : MyStructure =
MyStructure::from(
MyStructureInit {
req_field1 : "hey".into(),
req_field2 : 0
}
);
s1
.opt_field1("hey".into()) // no prefix with for mutable setter
.opt_field2(10)
.field2(15)
.reset_opt_field2(); // mutable reset function for optional fields
默认值
虽然您可以在自己的结构或辅助初始化结构上使用Rust的Default
,但这个库故意忽略这种方法,并为您提供了一个辅助的default
属性来管理它,例如
#[derive(Debug, Clone, PartialEq, Builder)]
struct StructWithDefault {
pub req_field1: String,
#[default="10"]
pub req_field2: i32, // default here make this field behave like optional
pub opt_field1: Option<String>,
#[default="Some(11)"]
pub opt_field2: Option<i32> // default works also on optional fields
}
let my_struct : StructWithDefault = StructWithDefault::from(
StructWithDefaultInit {
req_field1 : "test".into()
}
);
许可证
Apache软件许可证(ASL)
作者
Abdulla Abdurakhmanov
依赖关系
~1.5MB
~35K SLoC