use syn::{
parse::{Parse, ParseStream},
Expr, Ident, Result, Token,
};
pub(crate) struct DeleteArgs {
pub(crate) url: Option<Expr>,
pub(crate) headers: Option<Expr>,
pub(crate) client: Option<Expr>,
}
impl Parse for DeleteArgs {
fn parse(input: ParseStream) -> Result<Self> {
let mut url = None;
let mut headers = None;
let mut client = None;
while !input.is_empty() {
let key: Ident = input.parse()?;
input.parse::<Token![=>]>()?;
match key
.to_string()
.as_str()
{
"url" => {
if url.is_some() {
return Err(syn::Error::new_spanned(&key, "Duplicate 'url' parameter"));
}
url = Some(input.parse()?);
}
"headers" => {
if headers.is_some() {
return Err(syn::Error::new_spanned(&key, "Duplicate 'headers' parameter"));
}
headers = Some(input.parse()?);
}
"client" => {
if client.is_some() {
return Err(syn::Error::new_spanned(&key, "Duplicate 'client' parameter"));
}
client = Some(input.parse()?);
}
_ => {
return Err(syn::Error::new_spanned(
&key,
format!("Unknown parameter: {}", key),
));
}
}
if input.peek(Token![,]) {
input.parse::<Token![,]>()?;
}
}
Ok(DeleteArgs { url, headers, client })
}
}