fn get_queriable_field_props()

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