fn parse()

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