sark-gen 0.28.5

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

#[derive(Clone, Copy)]
pub(crate) enum Mode {
    Json,
    Raw,
    Exact,
}

impl parse::Parse for Mode {
    fn parse(input: parse::ParseStream<'_>) -> syn::Result<Self> {
        use syn::Ident;
        if input.is_empty() {
            return Err(syn::Error::new(
                input.span(),
                "#[sark_gen::response] requires an explicit `json`, `raw`, or `exact` mode",
            ));
        }
        let ident = input.parse::<Ident>()?;
        if ident == "json" || ident == "exact" {
            if !input.is_empty() {
                return Err(syn::Error::new_spanned(
                    input.parse::<proc_macro2::TokenStream>()?,
                    "#[sark_gen::response] supports only `json`, `raw`, or `exact`",
                ));
            }
            return Ok(if ident == "json" {
                Self::Json
            } else {
                Self::Exact
            });
        }
        if ident == "raw" {
            if !input.is_empty() {
                input.parse::<syn::Token![,]>()?;
                if !input.is_empty() {
                    return Err(syn::Error::new_spanned(
                        input.parse::<proc_macro2::TokenStream>()?,
                        "#[sark_gen::response] supports only `json`, `raw`, or `exact`",
                    ));
                }
            }
            return Ok(Self::Raw);
        }
        Err(syn::Error::new_spanned(
            ident,
            "#[sark_gen::response] supports only `json`, `raw`, or `exact`",
        ))
    }
}