in rust/ccommon-derive/src/attrs.rs [100:134]
fn parse(buf: &ParseBuffer) -> Result<Self> {
let seq: Punctuated<EqOption, Token![,]> = Punctuated::parse_terminated(buf)?;
let mut desc = None;
let mut name = None;
for opt in seq {
let span = opt.name.span();
let param = opt.name.to_string();
let seen = match &*param {
"desc" => mem::replace(&mut desc, Some(opt)).is_some(),
"name" => mem::replace(&mut name, Some(opt)).is_some(),
_ => {
return Err(Error::new(
opt.name.span(),
format!("Unknown option `{}`", opt.name),
))
}
};
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 })
}