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