Crates License: MIT CI Coverage Status Latest Stable Latest Release

Syner - A simple, fast and safe way to parse attributes from syn

Syner is a simple, fast and safe way to parse attributes from syn. It is designed to be used with the syn crate. Definition of your attributes is done using a procedural macro. This allows you to define your attributes in a type safe way. You create a struct that represents your attribute and then use the #[derive(Syner)] macro to generate the parsing code.

Example

```rust #[derive(Syner)] struct Test { pub some: String, pub maybe: Option, #[syner(default)] pub isdefault: bool, pub inner: Inner, pub innerlist: Vec, pub innerbools: Vec, pub innermaybe: Option, }

#[derive(Syner, PartialEq, Debug)]
struct Inner {
    pub some: String,
    pub is_default: bool,
}

```

This will parse the following attribute:

```rust

[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 {} ```

You can parse the attribute using the parse_attrs function. It takes an iterator of syn::Attribute and returns a Result with the parsed attribute.

rust let attrs = Test::parse_attrs(&item.attrs)?;

Supported types

Syner supports the following types: - String - Parses the value as a string - bool - Parses the value as a boolean - i8, i16, i32, i64, i128, isize - Parses the value as a signed integer - u8, u16, u32, u64, u128, usize - Parses the value as an unsigned integer - f32, f64 - Parses the value as a float - T - Parses the value as <name>(T) if T is a struct that implements Syner - Option<T> - Parses the value as T if it is present - Vec<T> - Parses the value as <name>(T...)

Annotating a field with #[syner(default)] will make it optional and use the default value if it is not present. You can also use #[syner(default = "<expr>")] to specify a default value. The name of the field is used as the name of the attribute except if the field is of type Vec<T>, in which case the name of the struct (lowercase) is used. For the top level attribute the lowercase name of the struct is used as a default name. If you want to use a different name you can annotate the struct with #[syner(name = "<name>")].

License

This project is licensed under the MIT License - see the LICENSE file for details