xenon_codegen/
switch_statement.rs

1use core::fmt;
2
3use crate::{case::Case, expression::Expression};
4
5#[derive(Debug, Clone, Default)]
6pub struct SwitchStatement {
7    pub condition: Expression,
8    pub cases: Vec<Case>,
9}
10impl SwitchStatement {
11    pub fn new(condition: Expression) -> SwitchStatement {
12        SwitchStatement {
13            condition,
14            cases: vec![],
15        }
16    }
17
18    pub fn is_valid(&self) -> bool {
19        if !self.condition.is_valid() {
20            return false;
21        }
22
23        for i in 0..self.cases.len() {
24            if !self.cases[i].is_valid() {
25                return false;
26            }
27        }
28        true
29    }
30}
31impl fmt::Display for SwitchStatement {
32    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33        match writeln!(fmt, "switch ({}) {{", self.condition) {
34            Ok(_) => (),
35            Err(e) => return Err(e),
36        }
37        for i in 0..self.cases.len() {
38            match write!(fmt, "{}", self.cases[i]) {
39                Ok(_) => (),
40                Err(e) => return Err(e),
41            }
42        }
43        match write!(fmt, "}}") {
44            Ok(_) => (),
45            Err(e) => return Err(e),
46        }
47
48        Ok(())
49    }
50}