workspacer_syntax/
generate_enum_signature.rs1crate::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 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 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 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}