use proc_macro2::TokenStream;
use syn::Type;
#[derive(Default)]
pub(crate) struct AttrArgs {
pub state: Option<Type>,
pub key: Option<Type>,
}
impl AttrArgs {
pub fn parse(attr: TokenStream) -> syn::Result<Self> {
let mut out = AttrArgs::default();
if attr.is_empty() {
return Ok(out);
}
let parser = syn::meta::parser(|meta| {
if meta.path.is_ident("state") {
out.state = Some(meta.value()?.parse()?);
Ok(())
} else if meta.path.is_ident("key") {
out.key = Some(meta.value()?.parse()?);
Ok(())
} else {
Err(meta.error("unsupported argument; expected `state = T` or `key = K`"))
}
});
syn::parse::Parser::parse2(parser, attr)?;
Ok(out)
}
}
pub(crate) fn combine_errors(mut errors: Vec<syn::Error>) -> syn::Error {
let mut iter = errors.drain(..);
let mut acc = iter.next().expect("combine_errors called with empty vec");
for e in iter {
acc.combine(e);
}
acc
}