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>
- 如果存在,则将值解析为T
Vec<T>
- 将值解析为<name>(T...)
使用 #[syner(default)]
注解一个字段,将其设置为可选的,如果不存在则使用默认值。您还可以使用 #[syner(default = "<expr>")]
来指定默认值。字段的名称用作属性的名称,除非字段类型为 Vec<T>
,在这种情况下使用结构体的名称(小写)。对于顶级属性,使用结构体的小写名称作为默认名称。如果您想使用不同的名称,可以使用 #[syner(name = "<name>")]
注解结构体。
许可
本项目遵循MIT许可协议 - 详细信息请参阅LICENSE文件
依赖
~1.5MB
~35K SLoC