5个不稳定版本
| 0.3.0 | 2023年2月3日 |
|---|---|
| 0.2.2 | 2023年2月3日 |
| 0.2.1 | 2023年2月3日 |
| 0.2.0 | 2023年2月3日 |
| 0.1.0 | 2023年2月3日 |
#1917 在 过程宏
16KB
273 代码行
Syner - 从syn中解析属性的一种简单、快速且安全的方法
Syner是从syn中解析属性的一种简单、快速且安全的方法。它旨在与syn crate一起使用。您的属性定义是通过过程宏完成的。这允许您以类型安全的方式定义属性。您创建一个表示您的属性的struct,然后使用#[derive(Syner)]宏来生成解析代码。
示例
#[derive(Syner)]
struct Test {
pub some: String,
pub maybe: Option<String>,
#[syner(default)]
pub is_default: bool,
pub inner: Inner,
pub inner_list: Vec<Inner>,
pub inner_bools: Vec<bool>,
pub inner_maybe: Option<Inner>,
}
#[derive(Syner, PartialEq, Debug)]
struct Inner {
pub some: String,
pub is_default: bool,
}
这将解析以下属性
#[test(
some = "hello",
inner(
some = "inner",
is_default = true
),
inner_list(
inner(
some = "inner_list0",
is_default = true
),
inner(
some = "inner_list1",
is_default = false
),
inner(
some = "inner_list2",
is_default = true
)
),
inner_bools(true, false, true)
)]
struct TestStruct {}
您可以使用parse_attrs函数解析属性。它接受一个syn::Attribute迭代器,并返回一个包含解析属性的Result。
let attrs = Test::parse_attrs(&item.attrs)?;
支持类型
Syner支持以下类型
String- 将值解析为字符串bool- 将值解析为布尔值i8,i16,i32,i64,i128,isize- 将值解析为有符号整数u8,u16,u32,u64,u128,usize- 将值解析为无符号整数f32,f64- 将值解析为浮点数T- 如果T是实现了Syner的结构体,则将其值解析为<name>(T)Option<T>- 如果存在,则将值解析为TVec<T>- 将值解析为<name>(T...)
使用 #[syner(default)] 注解一个字段,将其设置为可选的,如果不存在则使用默认值。您还可以使用 #[syner(default = "<expr>")] 来指定默认值。字段的名称用作属性的名称,除非字段类型为 Vec<T>,在这种情况下使用结构体的名称(小写)。对于顶级属性,使用结构体的小写名称作为默认名称。如果您想使用不同的名称,可以使用 #[syner(name = "<name>")] 注解结构体。
许可
本项目遵循MIT许可协议 - 详细信息请参阅LICENSE文件
依赖
~1.5MB
~35K SLoC