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日 |
#117 in #syn
用于 syner
33KB
661 行
Syner - 从syn解析属性的一个简单、快速且安全的方式
Syner 是从syn解析属性的一个简单、快速且安全的方式。它旨在与 syn 包一起使用。您的属性定义是通过过程宏完成的。这允许您以类型安全的方式定义属性。您创建一个表示您的属性的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
的struct,则将值解析为<name>(T)
Option<T>
- 如果存在,则将值解析为T
Vec<T>
- 将值解析为<name>(T...)
使用 #[syner(default)]
注释字段将使其成为可选的,并且如果不存在则使用默认值。您还可以使用 #[syner(default = "<expr>")]
指定默认值。字段的名称用作属性名称,除非字段类型为 Vec<T>
,在这种情况下,使用结构体的名称(小写)。对于顶级属性,使用结构体的小写名称作为默认名称。如果您想使用不同的名称,可以注释结构体为 #[syner(name = "<name>")]
。
许可证
本项目采用 MIT 许可证 - 有关详细信息,请参阅 LICENSE 文件
依赖项
~1.5MB
~36K SLoC