#proc-macro #syn #derive #syner

syner derive

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

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

MIT 许可证

33KB
661

Crates License: MIT CI Coverage Status Latest Stable Latest Release

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