macro-input 0.3.1

a library for parsing macro inputs
Documentation
use macro_input::MacroInput;
use std::{convert::TryFrom, fmt::Debug};
use syn::{export::Span, parse_quote, Attribute, Ident};

#[derive(MacroInput, PartialEq, Debug)]
pub struct Input {
    pub flag: Option<()>,
    pub optional: Option<i32>,
    #[macro_input(default_value = 3)]
    pub with_default: i32,
    pub required: i32,
}

#[test]
fn test_basic_input() {
    fn test_input(attr: Attribute, value: Input) {
        let attrs = vec![attr];

        let res = Input::try_from(attrs.as_slice()).unwrap();
        assert_eq!(value, res);
    }

    test_input(
        parse_quote!(#[input(flag, optional = 1, with_default = 2, required = 3)]),
        Input {
            flag: Some(()),
            optional: Some(1),
            with_default: 2,
            required: 3,
        },
    );

    test_input(
        parse_quote!(#[input(required = 3)]),
        Input {
            flag: None,
            optional: None,
            with_default: 3,
            required: 3,
        },
    );
}

#[derive(MacroInput, PartialEq, Debug)]
#[macro_input(rename = "yet_another_name")]
pub struct OtherInput {
    #[macro_input(rename = "new_name")]
    pub renamed: i32,
}

#[test]
fn test_other_input() {
    fn test_input(attr: Attribute, value: OtherInput) {
        let attrs = vec![attr];

        let res = OtherInput::try_from(attrs.as_slice()).unwrap();
        assert_eq!(value, res);
    }

    test_input(
        parse_quote!(#[yet_another_name(new_name = 3)]),
        OtherInput { renamed: 3 },
    );
}

#[derive(MacroInput, PartialEq, Debug)]
pub struct IdentInput {
    pub idents1: Vec<Ident>,
    pub idents2: Option<Vec<Ident>>,
    pub idents3: Option<Vec<Ident>>,
}

#[test]
fn test_idents() {
    fn test_input(attr: Attribute, value: IdentInput) {
        let attrs = vec![attr];

        let res = IdentInput::try_from(attrs.as_slice()).unwrap();
        assert_eq!(value, res);
    }

    test_input(
        parse_quote!(#[ident_input(idents1(foo, bar), idents2(foo, bar))]),
        IdentInput {
            idents1: vec![
                Ident::new("foo", Span::call_site()),
                Ident::new("bar", Span::call_site()),
            ],
            idents2: Some(vec![
                Ident::new("foo", Span::call_site()),
                Ident::new("bar", Span::call_site()),
            ]),
            idents3: None,
        },
    );
}