fn extract_options()

in starlark_derive/src/freeze.rs [121:164]


fn extract_options(attrs: &[Attribute]) -> syn::Result<FreezeDeriveOptions> {
    syn::custom_keyword!(validator);
    syn::custom_keyword!(bounds);

    let mut opts = FreezeDeriveOptions::default();

    for attr in attrs.iter() {
        if !attr.path.is_ident("freeze") {
            continue;
        }

        attr.parse_args_with(|input: ParseStream| {
            loop {
                let lookahead = input.lookahead1();
                if lookahead.peek(validator) {
                    if opts.validator.is_some() {
                        return Err(input.error("`validator` was set twice"));
                    }
                    input.parse::<validator>()?;
                    input.parse::<Token![=]>()?;
                    opts.validator = Some(input.parse()?);
                } else if lookahead.peek(bounds) {
                    if opts.bounds.is_some() {
                        return Err(input.error("`bounds` was set twice"));
                    }
                    input.parse::<bounds>()?;
                    input.parse::<Token![=]>()?;
                    let bounds_input = input.parse::<LitStr>()?;
                    opts.bounds = Some(bounds_input.parse()?);
                } else {
                    return Err(lookahead.error());
                }

                if input.parse::<Option<Token![,]>>()?.is_none() {
                    break;
                }
            }

            Ok(())
        })?;
    }

    Ok(opts)
}