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
use dagger_core::introspection::FullType;
use genco::prelude::rust;
use genco::quote;

fn render_enum_values(values: &FullType) -> Option<rust::Tokens> {
    let values = values
        .enum_values
        .as_ref()
        .into_iter()
        .map(|values| {
            values
                .into_iter()
                .map(|val| quote! { $(val.name.as_ref()), })
        })
        .flatten()
        .collect::<Vec<_>>();

    let mut tokens = rust::Tokens::new();
    for val in values {
        tokens.append(val);
        tokens.push();
    }

    Some(tokens)
}

pub fn render_enum(t: &FullType) -> eyre::Result<rust::Tokens> {
    let serialize = rust::import("serde", "Serialize");

    Ok(quote! {
        #[derive($serialize)]
        pub enum $(t.name.as_ref()) {
            $(render_enum_values(t))
        }
    })
}