postgres_named_parameters_derive/
util.rs

1use quote::quote;
2
3pub fn get_field_names(struct_ast: &syn::DataStruct) -> Vec<String> {
4    match struct_ast.fields {
5        syn::Fields::Unnamed(_) => vec![],
6        syn::Fields::Unit => vec![],
7        syn::Fields::Named(ref named_fields) => get_field_identifiers(named_fields)
8            .iter()
9            .map(|f| f.to_string())
10            .collect(),
11    }
12}
13
14pub fn get_parameter_list(struct_ast: &syn::DataStruct) -> proc_macro2::TokenStream {
15    match &struct_ast.fields {
16        syn::Fields::Unit => quote!(&[]),
17        syn::Fields::Named(ref named_fields) => {
18            let field_names = get_field_identifiers(named_fields);
19            quote! {
20                &[
21                    #(&self.#field_names),*
22                ]
23            }
24        }
25        syn::Fields::Unnamed(unnamed_fields) => {
26            let indices = (0..unnamed_fields.unnamed.len()).map(syn::Index::from);
27            quote! {
28                &[
29                    #(&self.#indices),*
30                ]
31            }
32        }
33    }
34}
35
36fn get_field_identifiers(named_fields: &syn::FieldsNamed) -> Vec<proc_macro2::Ident> {
37    named_fields
38        .named
39        .iter()
40        .filter_map(|named_field| named_field.ident.as_ref().map(|i| i.to_owned()))
41        .collect()
42}