in metrics/derive/src/metric.rs [46:110]
fn parse(input: ParseStream) -> syn::Result<Self> {
let mut args = MetricArgs::default();
let mut first = true;
fn duplicate_arg_error(
span: Span,
arg: &impl std::fmt::Display,
) -> syn::Result<MetricArgs> {
Err(Error::new(
span,
format!("Unexpected duplicate argument '{}'", arg),
))
}
while !input.is_empty() {
if !first {
let _: Token![,] = input.parse()?;
}
first = false;
let arg: ArgName = input.fork().parse()?;
match &*arg.to_string() {
"name" => {
let name = input.parse()?;
match args.name {
None => args.name = Some(name),
Some(_) => return duplicate_arg_error(name.span(), &arg),
}
}
"namespace" => {
let namespace = input.parse()?;
match args.namespace {
None => args.namespace = Some(namespace),
Some(_) => return duplicate_arg_error(namespace.span(), &arg),
}
}
"description" => {
let description = input.parse()?;
match args.description {
None => args.description = Some(description),
Some(_) => return duplicate_arg_error(description.span(), &arg),
}
}
"crate" => {
let krate = SingleArg {
ident: input.parse()?,
eq: input.parse()?,
value: Path::parse_mod_style(input)?,
};
match args.krate {
None => args.krate = Some(krate),
Some(_) => return duplicate_arg_error(krate.span(), &arg),
}
}
x => {
return Err(Error::new(
arg.span(),
format!("Unrecognized argument '{}'", x),
))
}
}
}
Ok(args)
}