sark-gen 0.26.0

Sark proc-macro generators
Documentation
use syn::parse;

#[derive(Default)]
pub(crate) struct Args {
    pub(super) request: Option<syn::Type>,
    pub(super) vis: Option<syn::Visibility>,
}

impl parse::Parse for Args {
    fn parse(input: parse::ParseStream<'_>) -> syn::Result<Self> {
        let vis = if input.peek(syn::Token![pub]) {
            let vis = Some(input.parse()?);
            if !input.is_empty() {
                input.parse::<syn::Token![,]>()?;
            }
            vis
        } else {
            None
        };
        if input.is_empty() {
            return Ok(Self { request: None, vis });
        }
        let name: syn::Ident = input.parse()?;
        if name != "request" {
            return Err(syn::Error::new(name.span(), "expected `request = Type`"));
        }
        input.parse::<syn::Token![=]>()?;
        let request = input.parse()?;
        if !input.is_empty() {
            return Err(input.error("unexpected handler argument"));
        }
        Ok(Self {
            request: Some(request),
            vis,
        })
    }
}