xenon_codegen/
enum.rs

1use std::fmt;
2
3use crate::{Visibility, attribute::Attribute};
4
5#[derive(Debug, Clone, Default)]
6pub struct Enum {
7    pub visibility: Visibility,
8    pub attrs: Vec<Attribute>,
9    pub name: String,
10    pub variants: Vec<Variant>,
11}
12impl Enum {
13    pub fn new(name: String) -> Enum {
14        Enum {
15            visibility: Visibility::Private,
16            attrs: vec![],
17            name,
18            variants: vec![],
19        }
20    }
21
22    pub fn is_valid(&self) -> bool {
23        for i in 0..self.attrs.len() {
24            if !self.attrs[i].is_valid() {
25                return false;
26            }
27        }
28        if self.name.is_empty() {
29            return false;
30        }
31        for i in 0..self.variants.len() {
32            if !self.variants[i].is_valid() {
33                return false;
34            }
35        }
36        true
37    }
38}
39impl fmt::Display for Enum {
40    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
41        for i in 0..self.attrs.len() {
42            match writeln!(fmt, "{}", self.attrs[i]) {
43                Ok(_) => (),
44                Err(e) => return Err(e),
45            }
46        }
47        match write!(fmt, "{} enum {} {{", self.visibility, self.name) {
48            Ok(_) => (),
49            Err(e) => return Err(e),
50        }
51        for i in 0..self.variants.len() {
52            match writeln!(fmt, "{}", self.variants[i]) {
53                Ok(_) => (),
54                Err(e) => return Err(e),
55            }
56        }
57        match write!(fmt, "}}") {
58            Ok(_) => (),
59            Err(e) => return Err(e),
60        }
61        Ok(())
62    }
63}
64
65#[derive(Debug, Clone, Default)]
66pub struct Variant {
67    pub attrs: Vec<Attribute>,
68    pub name: String,
69}
70impl Variant {
71    pub fn new(name: String) -> Variant {
72        Variant {
73            attrs: vec![],
74            name,
75        }
76    }
77
78    pub fn is_valid(&self) -> bool {
79        for i in 0..self.attrs.len() {
80            if !self.attrs[i].is_valid() {
81                return false;
82            }
83        }
84        true
85    }
86}
87impl fmt::Display for Variant {
88    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
89        for i in 0..self.attrs.len() {
90            match writeln!(fmt, "{}", self.attrs[i]) {
91                Ok(_) => (),
92                Err(e) => return Err(e),
93            }
94        }
95        match writeln!(fmt, "{},", self.name) {
96            Ok(_) => (),
97            Err(e) => return Err(e),
98        }
99        Ok(())
100    }
101}