#syn #proc-macro #derive #parse-attributes

syner

一个用于从结构体生成属性解析器的过程宏

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过程宏

MIT 许可证

16KB
273 代码行

Crates License: MIT CI Coverage Status Latest Stable Latest Release

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