13 个不稳定版本 (5 个破坏性更新)
新增 0.20.0 | 2024 年 8 月 22 日 |
---|---|
0.19.1 | 2024 年 7 月 14 日 |
0.19.0 | 2024 年 6 月 15 日 |
0.18.1 | 2024 年 1 月 16 日 |
0.15.1 | 2023 年 7 月 10 日 |
2956 在 Rust 模式 中排名
504,402 次每月下载
在 467 个crate中使用 (2 个直接使用)
78KB
1.5K SLoC
Rust 类型化构建器
创建一个编译时验证的构建器
use typed_builder::TypedBuilder;
#[derive(TypedBuilder)]
struct Foo {
// Mandatory Field:
x: i32,
// #[builder(default)] without parameter - use the type's default
// #[builder(setter(strip_option))] - wrap the setter argument with `Some(...)`
#[builder(default, setter(strip_option))]
y: Option<i32>,
// Or you can set the default
#[builder(default=20)]
z: i32,
}
以任何顺序构建
Foo::builder().x(1).y(2).z(3).build();
Foo::builder().z(1).x(2).y(3).build();
省略可选字段(用 #[default]
标记的)
Foo::builder().x(1).build()
但不能省略非可选参数 - 否则无法编译
Foo::builder().build(); // missing x
Foo::builder().x(1).y(2).y(3); // y is specified twice
功能
- 用于生成构建器模式的自定义派生。
- 能够使用
#[builder(setter(into))
注释字段,使它们的设置器接受Into
值。 - 在调用
.build()
之前,对所有字段进行编译时验证,以确保所有字段都已设置。 - 编译时验证没有字段被设置两次以上。
- 能够使用
#[builder(default)]
注释字段,使它们可选,并在用户未设置它们时指定默认值。 - 为
.builder()
方法生成简单的文档。 - 自定义
.build()
方法的名称和可见性。
限制
- 当你忘记设置字段或设置字段时,构建会出错,但实际问题被作为弃用警告而不是主要错误来描述。
- 生成的构建器类型具有丑陋的内部名称和许多泛型参数。它不是为了传递和进行复杂的构建器技巧而设计的 - 只是为了更简洁的对象创建语法(具有命名参数和可选参数的构造函数)。
- 因此,所有构建器方法都是按值调用,并且构建器不可克隆。这样就避免了确定字段是否可克隆的麻烦...
- 如果您需要一个可以传递的构建器,请查看 derive-builder。它的 API 与 typed-builder 不冲突,因此您可以在同一类型上实现它们。
冲突
TypedBuilder
接受用于#[builder(default = ...)]
的任意 Rust 代码,但其他自定义 derive proc-macro 软件包可能会尝试使用仅允许字面量的较旧限制来解析它们。为了解决这个问题,请使用#[builder(default_code = "...")]
代替。
替代方案 - 以及为什么 typed-builder 更好
- derive-builder - 在运行时进行所有检查,返回您需要解包的
Result
。 - safe-builder-derive - 这个在编译时进行检查 - 通过为构建器的每个可能状态生成一个类型。Rust 可以删除死代码,但您的构建时间仍然呈指数级。typed-builder 是通过泛型参数来编码构建器的状态 - 因此 Rust 只会生成您实际使用的路径。
许可证
根据您选择以下许可证之一授予许可
- Apache License,版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,任何有意提交以包含在作品中的贡献,均应按上述方式双许可,而无需任何额外的条款或条件。
依赖关系
~265–720KB
~17K SLoC