1use wdl_ast::SyntaxKind;
4
5use crate::PreToken;
6use crate::TokenStream;
7use crate::Writable as _;
8use crate::element::FormatElement;
9
10pub fn format_enum_definition(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
16 let mut children = element.children().expect("enum definition children");
17
18 let enum_keyword = children.next().expect("enum keyword");
19 assert!(enum_keyword.element().kind() == SyntaxKind::EnumKeyword);
20 (&enum_keyword).write(stream);
21 stream.end_word();
22
23 let name = children.next().expect("enum name");
24 assert!(name.element().kind() == SyntaxKind::Ident);
25 (&name).write(stream);
26
27 let mut variants = Vec::new();
28 let mut commas = Vec::new();
29 let mut close_brace = None;
30
31 for child in children {
32 match child.element().kind() {
33 SyntaxKind::EnumTypeParameterNode => {
34 (&child).write(stream);
35 }
36 SyntaxKind::OpenBrace => {
37 stream.end_word();
38 (&child).write(stream);
39 stream.end_line();
40 stream.increment_indent();
41 }
42 SyntaxKind::EnumVariantNode => {
43 variants.push(child.clone());
44 }
45 SyntaxKind::Comma => {
46 commas.push(child.clone());
47 }
48 SyntaxKind::CloseBrace => {
49 close_brace = Some(child.clone());
50 }
51 _ => {
52 unreachable!(
53 "unexpected child in enum definition: {:?}",
54 child.element().kind()
55 );
56 }
57 }
58 }
59
60 let mut commas = commas.iter();
61 for variant in variants {
62 (&variant).write(stream);
63 if let Some(comma) = commas.next() {
64 (comma).write(stream);
65 } else {
66 stream.push_literal(",".to_string(), SyntaxKind::Comma);
67 }
68 stream.end_line();
69 }
70
71 stream.decrement_indent();
72 (&close_brace.expect("enum definition close brace")).write(stream);
73 stream.end_line();
74}
75
76pub fn format_enum_variant(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
82 let mut children = element.children().expect("enum variant children");
83
84 let name = children.next().expect("enum variant name");
85 assert!(name.element().kind() == SyntaxKind::Ident);
86 (&name).write(stream);
87
88 for child in children {
89 match child.element().kind() {
90 SyntaxKind::Assignment => {
91 stream.end_word();
92 (&child).write(stream);
93 stream.end_word();
94 }
95 _ => {
96 (&child).write(stream);
97 }
98 }
99 }
100}
101
102pub fn format_enum_type_parameter(element: &FormatElement, stream: &mut TokenStream<PreToken>) {
108 for child in element.children().expect("enum type parameter children") {
109 (&child).write(stream);
110 }
111}