in rust/ccommon-derive/src/attrs.rs [138:173]
fn parse(buf: &ParseBuffer) -> Result<Self> {
let seq: Punctuated<AttrOption<StrOrExpr>, Token![,]> = Punctuated::parse_terminated(buf)?;
let mut desc = None;
let mut name = None;
let mut default = None;
for val in seq {
let span = val.span();
let param = val.name.to_string();
let seen = match &*param {
"desc" => mem::replace(&mut desc, Some(val.into_lit()?)).is_some(),
"name" => mem::replace(&mut name, Some(val.into_lit()?)).is_some(),
"default" => mem::replace(&mut default, Some(val.into_expr())).is_some(),
_ => return Err(Error::new(span, format!("Unknown option `{}`", param))),
};
if seen {
return Err(Error::new(
span,
format!("`{}` may only be specified once", param),
));
}
}
let desc = match desc {
Some(x) => x,
None => return Err(buf.error("Expected a `desc` parameter here")),
};
Ok(Self {
desc,
name,
default,
})
}