vin-macros 6.0.0

Procedural macros that power vin
Documentation
use syn::{Ident, parse::Parse, Error, LitInt, TypePath, Token, token};

pub struct HandlesAttr {
    pub msg_type: TypePath,
    pub max_messages_at_once: usize,
}

impl Parse for HandlesAttr {
    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
        let msg_type = input.parse::<TypePath>()?;

        if input.is_empty() { return Ok(HandlesAttr { msg_type, max_messages_at_once: 100_000 }) }

        input.parse::<token::Comma>()?;

        let arg = input.parse::<Ident>()?;
        let max_messages_at_once = match arg.to_string().as_str() {
            "max" => {
                input.parse::<Token![=]>()?;
                let size = input.parse::<LitInt>()?.base10_parse::<usize>()?;
                size
            },
            _ => return Err(Error::new(arg.span(), "unknown argument name; valid arguments are: 'max'")),
        };

        Ok(HandlesAttr {
            msg_type,
            max_messages_at_once,
        })
    }
}