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