pub struct RouteArgs {
pub method: Option<syn::Ident>,
pub path: Option<syn::LitStr>,
}
impl syn::parse::Parse for RouteArgs {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let mut method: Option<syn::Ident> = None;
let mut path: Option<syn::LitStr> = None;
while !input.is_empty() {
let lookahead = input.lookahead1();
if lookahead.peek(syn::Ident) {
let ident: syn::Ident = input.parse()?;
let ident_str = ident.to_string().to_lowercase();
match ident_str.as_str() {
"get" | "post" | "put" | "patch" | "delete" | "head" | "options" => {
method = Some(ident);
}
"path" => {
input.parse::<syn::Token![=]>()?;
let lit: syn::LitStr = input.parse()?;
path = Some(lit);
}
_ => {
return Err(lookahead.error());
}
}
} else {
return Err(lookahead.error());
}
if input.peek(syn::Token![,]) {
input.parse::<syn::Token![,]>()?;
} else {
break;
}
}
Ok(RouteArgs { method, path })
}
}