1个不稳定版本
0.1.0 | 2024年7月21日 |
---|
1697 在 过程宏
149 每月下载量
用于 deepseek-api-client
12KB
162 行
optional-default
帮助宏,允许为Rust结构体的一些字段指定默认值,同时要求其他字段手动初始化。
使用方法
将optional-default
添加到你的crate依赖项中:cargo add optional-default
- 使用
OptionalDefault
派生宏注解你的结构体。 - 使用
#[optional]
注解任何可选字段。 - 如果字段应该有除
Default之外的其他默认值,或者其类型不实现
Default
特质,你可以在#[optional(default = <value>)]
中指定自己的默认值。 - 该宏将生成一个与你的结构体同名的第二个宏。使用此宏初始化具有指定默认值的结构体
示例
use optional_default::OptionalDefault;
#[derive(Debug, OptionalDefault)]
struct Example {
foo: i32, // Required field
#[optional]
bar: i32 // Optional, default = i32::default() = 0
#[optional(default = 10)]
baz: i32, // Optional, default = 10
}
fn example() {
// Use the macro as if it was a struct declaration
let example1 = Example! {
foo: 1
// The other fields are set to their default values
};
println!("{:?}", example1); // Example { foo:1, bar: 0, baz: 10 }
let example2 = Example! {
foo: 1,
bar: 5
};
println!("{:?}", example2); // Example { foo:1, bar: 5, baz: 10 }
let example3 = Example! {
foo: 20,
baz: 0 // You can override the default values
};
println!("{:?}", example1); // Example { foo:1, bar: 0, baz: 20 }
let does_not_work = Example! {
baz: 0
}; // Error: missing required field foo
}
限制
目前,该宏只能放置在结构体上。虽然可以将此方法实现为枚举,但初始化语法将与常规枚举初始化不一致,因为Enum::Variant
不是一个有效的宏名。
依赖
~300–760KB
~18K SLoC