1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
use super::*;

pub fn expand_fields(
    fields: &syn::Fields,
    rename_fields: RenameRule,
) -> Result<TokenStream2> {
    match fields {
        syn::Fields::Named(inner) => expand_named_fields(inner, rename_fields),
        syn::Fields::Unnamed(inner) => expand_unnamed_fields(inner),
        syn::Fields::Unit => Ok(expand_unit_fields()),
    }
}

fn expand_named_fields(
    fields: &syn::FieldsNamed,
    rename_fields: RenameRule,
) -> Result<TokenStream2> {
    let fields: Vec<_> = fields
        .named
        .iter()
        .map(|field| expand_field(field, true, rename_fields))
        .collect::<Result<_>>()?;

    Ok(quote! {
        ::doku::Fields::Named {
            fields: vec![ #(#fields)* ],
        }
    })
}

fn expand_unnamed_fields(fields: &syn::FieldsUnnamed) -> Result<TokenStream2> {
    let fields: Vec<_> = fields
        .unnamed
        .iter()
        .map(|field| expand_field(field, false, RenameRule::None))
        .collect::<Result<_>>()?;

    Ok(quote! {
        ::doku::Fields::Unnamed {
            fields: vec![ #(#fields)* ],
        }
    })
}

fn expand_unit_fields() -> TokenStream2 {
    quote! {
        ::doku::Fields::Unit
    }
}