Skip to main content

wdl_format/v1/
enum.rs

1//! Formatting for enums.
2
3use wdl_ast::SyntaxKind;
4
5use crate::PreToken;
6use crate::TokenStream;
7use crate::Writable as _;
8use crate::element::FormatElement;
9
10/// Formats an [`EnumDefinition`](wdl_ast::v1::EnumDefinition).
11///
12/// # Panics
13///
14/// This will panic if the element does not have the expected children.
15pub 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
76/// Formats an [`EnumVariant`](wdl_ast::v1::EnumVariant).
77///
78/// # Panics
79///
80/// This will panic if the element does not have the expected children.
81pub 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
102/// Formats an [`EnumTypeParameter`](wdl_ast::v1::EnumTypeParameter).
103///
104/// # Panics
105///
106/// This will panic if the element does not have the expected children.
107pub 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}