#derive-builder #builder-pattern #user #macro #generate #consumer #auto

builder_derive

一个简单的过程宏,允许用户自动生成简单的构建器模式

1 个不稳定版本

0.0.1 2024年5月5日

#28 in #derive-builder


用于 disarmv7

自定义许可证

19KB
367

builder-derive

builder-derive提供了两个主要的宏,构建器和消费者宏,这个crate主要作为一个支持crate存在,用于disarmv7,但也可以在其他地方使用。对于大多数情况,存在更好的替代方案,例如derive_builder,但它需要unwraps,而在构建器中通常不需要,因为类型系统可以保证安全构造。

示例

构建器

use builder_derive::Builder;

#[derive(Builder)]
pub struct CoolStruct {
    field_a: usize,
    field_b: i32
}


let implementation = CoolStruct::builder().set_field_a(2).set_field_b(4).complete();

assert!(implementation.field_a == 2);
assert!(implementation.field_b == 4);

如果任何字段没有指定,它将失败。

use builder_derive::Builder;

#[derive(Builder)]
pub struct CoolStruct {
    field_a: usize,
    field_b: i32
}


let implementation = CoolStruct::builder().set_field_a(2).complete();

消费者

消费者模式比较小众,但如果你有一堆自动生成的结构体,并且想确保不遗漏任何情况,它是有用的。

use builder_derive::{Builder,Consumer};

#[derive(Builder,Consumer,PartialEq)]
pub struct CoolStruct {
    field_a: usize,
    field_b: i32
}


let implementation = CoolStruct::builder().set_field_a(2).set_field_b(4).complete();

assert!(implementation.field_a == 2);
assert!(implementation.field_b == 4);

let consumer = implementation.consumer();
let (field_a,consumer) = consumer.consume_field_a();
let (field_b,consumer) = consumer.consume_field_b();
consumer.consume();
assert!(field_a == 2);
assert!(field_b == 4);

如果任何字段未被消费,它将无法编译。

use builder_derive::{Builder,Consumer};

#[derive(Builder,Consumer,PartialEq)]
pub struct CoolStruct {
    field_a: usize,
    field_b: i32
}


let implementation = CoolStruct::builder().set_field_a(2).set_field_b(4).complete();

assert!(implementation.field_a == 2);
assert!(implementation.field_b == 4);

let consumer = implementation.consumer();
let (field_a,consumer) = consumer.consume_field_a();
consumer.consume();
assert!(field_a == 2);

未来扩展

有一个扩展可以支持泛型,还有一个扩展允许用户指定一个转换函数,该函数将转换为字段类型。

许可证

此存储库根据MIT许可证授权,任何贡献都应使用相同的许可证,除非明确说明。

依赖项

~255–700KB
~17K SLoC