wasmer-bus-macros 1.1.0

WebAssembly Bus Macros
Documentation
use proc_macro2::Span;
use std::str::FromStr;
use syn::parse::{Parse, ParseStream, Result};
use syn::{LitStr, Token};
use wasmer_bus_types::SerializationFormat;

pub struct ArgsFormat {
    pub format_token: kw::format,
    pub eq_token: Token![=],
    pub format_val: SerializationFormat,
}

#[derive(Default)]
pub struct Args {
    pub format: Option<ArgsFormat>,
}

mod kw {
    syn::custom_keyword!(format);
}

impl Parse for Args {
    fn parse(input: ParseStream) -> Result<Args> {
        try_parse(input)
    }
}

pub(crate) fn try_parse(input: ParseStream) -> Result<Args> {
    let mut args = Args::default();

    let lookahead = input.lookahead1();
    if lookahead.peek(kw::format) {
        args.format = Some(ArgsFormat {
            format_token: input.parse::<kw::format>()?,
            eq_token: input.parse()?,
            format_val: SerializationFormat::from_str(input.parse::<LitStr>()?.value().as_str())
                .map_err(|e| syn::Error::new(Span::call_site(), e))?,
        });
    } else {
        return Err(lookahead.error());
    }

    Ok(args)
}