in below/below_derive/src/queriable.rs [138:190]
fn get_queriable_field_props(field: &Field) -> syn::Result<QueriableFieldProps> {
let mut ignore = false;
let mut subquery = None;
let mut preferred_name = None;
let mut ignore_kw = None;
let mut subquery_kw = None;
let mut preferred_name_kw = None;
let option_type = parse_option(&field.ty);
for meta in get_metadata("queriable", &field.attrs)? {
match meta {
FieldMeta::Ignore(kw) => {
if let Some(fst_kw) = ignore_kw {
return Err(occurrence_error(fst_kw, kw, "ignore"));
}
ignore_kw = Some(kw);
ignore = true;
}
FieldMeta::Subquery(kw) => {
if let Some(fst_kw) = subquery_kw {
return Err(occurrence_error(fst_kw, kw, "subquery"));
}
subquery_kw = Some(kw);
// Extract field if it's wrapped inside Option
let base_type = option_type.as_ref().unwrap_or(&field.ty);
// subquery field must implement Queriable
subquery = Some(syn::parse_quote! {
<#base_type as Queriable>::FieldId
});
}
FieldMeta::PreferredName { value, kw } => {
if let Some(fst_kw) = preferred_name_kw {
return Err(occurrence_error(fst_kw, kw, "preferred_name"));
}
preferred_name_kw = Some(kw);
preferred_name = Some(value.clone());
}
}
}
let ident = field
.ident
.clone()
.ok_or_else(|| syn::Error::new(field.span(), "This macro only support named fields"))?;
let preferred_name = preferred_name.unwrap_or_else(|| ident.clone());
let variant_name = to_camelcase(&preferred_name);
Ok(QueriableFieldProps {
ignore,
subquery,
preferred_name,
ident,
variant_name,
option_type,
})
}