fn parse()

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 })
    }