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 日

2956Rust 模式 中排名

Download history 92058/week @ 2024-05-04 98802/week @ 2024-05-11 96195/week @ 2024-05-18 93574/week @ 2024-05-25 98389/week @ 2024-06-01 95988/week @ 2024-06-08 103716/week @ 2024-06-15 103953/week @ 2024-06-22 94905/week @ 2024-06-29 108322/week @ 2024-07-06 101715/week @ 2024-07-13 117937/week @ 2024-07-20 127121/week @ 2024-07-27 123534/week @ 2024-08-03 126907/week @ 2024-08-10 106138/week @ 2024-08-17

504,402 次每月下载
467 个crate中使用 (2 个直接使用)

MIT/Apache

78KB
1.5K SLoC

Build Status Latest Version Rust Documentation

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-2.0 许可证定义的,任何有意提交以包含在作品中的贡献,均应按上述方式双许可,而无需任何额外的条款或条件。

依赖关系

~265–720KB
~17K SLoC