workspacer_syntax/
generate_enum_signature.rs

1// ---------------- [ File: workspacer-syntax/src/generate_enum_signature.rs ]
2crate::ix!();
3
4#[derive(Debug, Clone)]
5pub struct EnumSignatureGenerator(ast::Enum);
6
7impl GenerateSignature for ast::Enum {
8
9    fn generate_signature_with_opts(&self, opts: &SignatureOptions) -> String {
10        trace!("Generating signature for ast::Enum with opts: {:?}", opts);
11
12        let doc_text = if *opts.include_docs() {
13            extract_docs(&self.syntax())
14                .map(|d| format!("{}\n", d))
15                .unwrap_or_default()
16        } else {
17            "".to_string()
18        };
19
20        let vis_str = self
21            .visibility()
22            .map(|v| format!("{} ", v.syntax().text()))
23            .unwrap_or_default();
24
25        let name = self
26            .name()
27            .map(|n| n.text().to_string())
28            .unwrap_or_else(|| "<unknown_enum>".to_string());
29
30        let generic_params_raw = self
31            .generic_param_list()
32            .map(|g| g.syntax().text().to_string())
33            .unwrap_or_default();
34
35        let where_clause = full_clean_where_clause(&self.where_clause());
36
37        // If fully_expand, we gather actual variants:
38        let variants_text = {
39            if let Some(variant_list) = self.variant_list() {
40                let items: Vec<String> = variant_list
41                    .variants()
42                    .map(|v| {
43                        let vname = v.name().map(|x| x.text().to_string()).unwrap_or_default();
44                        // If it has a field list, we expand them, else just the variant name
45                        if let Some(fl) = v.field_list() {
46                            match fl {
47                                ast::FieldList::RecordFieldList(rfl) => {
48                                    let fields: Vec<String> = rfl.fields().map(|f| {
49                                        let fname = f
50                                            .name()
51                                            .map(|n| n.text().to_string())
52                                            .unwrap_or_default();
53                                        let fty = f
54                                            .ty()
55                                            .map(|t| t.syntax().text().to_string())
56                                            .unwrap_or_default();
57                                        format!("{fname}: {fty}")
58                                    }).collect();
59                                    format!("{vname} {{ {} }}", fields.join(", "))
60                                }
61                                ast::FieldList::TupleFieldList(tfl) => {
62                                    let fields: Vec<String> = tfl.fields().map(|f| {
63                                        let fty = f.ty().map(|t| t.syntax().text().to_string()).unwrap_or_default();
64                                        fty
65                                    }).collect();
66                                    format!("{vname}({})", fields.join(", "))
67                                }
68                            }
69                        } else {
70                            // no fields
71                            vname
72                        }
73                    })
74                    .collect();
75                format!("{{\n    {},\n}}", items.join(",\n    "))
76            } else {
77                ";".to_string()
78            }
79        };
80
81        let core = format!(
82            "{vis_str}enum {name}{generic_params_raw}{where_clause} {variants_text}"
83        );
84
85        let final_sig = format!("{doc_text}{core}");
86        post_process_spacing(&final_sig)
87    }
88}