errorx-macros 0.0.1

macros for the errorx crate.
Documentation
#[derive(Clone)]
pub struct Params {
    pub name: Option<String>,
    pub code: Option<u16>,
    pub message: Option<String>,
}

impl syn::parse::Parse for Params {
    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
        if let Ok(literal) = input.parse::<syn::LitStr>() {
            return Ok(Self {
                name: None,
                code: None,
                message: Some(literal.value()),
            });
        }

        let mut params = Self {
            name: None,
            code: None,
            message: None,
        };

        while let Ok(key) = input.parse::<syn::Ident>() {
            input.parse::<syn::Token![=]>()?;

            match key.to_string().as_str() {
                "name" => {
                    let value: syn::LitStr = input.parse()?;
                    params.name = Some(value.value());
                }
                "code" => {
                    let value: syn::LitInt = input.parse()?;
                    params.code = Some(value.base10_parse()?);
                }
                "message" => {
                    let value: syn::LitStr = input.parse()?;
                    params.message = Some(value.value());
                }
                _ => {
                    return Err(syn::parse::Error::new(
                        key.span(),
                        format!("error attribute parameter '{}' is invalid", &key),
                    ));
                }
            };

            if !input.peek(syn::Token![,]) {
                break;
            }

            input.parse::<syn::Token![,]>()?;
        }

        return Ok(params);
    }
}