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}