xenon_codegen/
struct.rs

1use core::fmt;
2
3use crate::{
4    Visibility, attribute::Attribute, r#type::Type, variable_definition::VariableDefinition,
5};
6
7#[derive(Debug, Clone, Default)]
8pub struct Struct {
9    pub attrs: Vec<Attribute>,
10    pub visibility: Visibility,
11    pub name: Type,
12    pub base: Option<Type>,
13    pub properties: Vec<VariableDefinition>,
14}
15impl Struct {
16    pub fn new(name: Type) -> Struct {
17        Struct {
18            attrs: vec![],
19            visibility: Visibility::Private,
20            name,
21            base: None,
22            properties: vec![],
23        }
24    }
25
26    pub fn is_valid(&self) -> bool {
27        for i in 0..self.attrs.len() {
28            if !self.attrs[i].is_valid() {
29                return false;
30            }
31        }
32        if !self.name.is_valid() {
33            return false;
34        }
35        if let Some(b) = self.base.clone() {
36            if !b.is_valid() {
37                return false;
38            }
39        }
40        for i in 0..self.properties.len() {
41            if !self.properties[i].is_valid() {
42                return false;
43            }
44        }
45
46        true
47    }
48}
49impl fmt::Display for Struct {
50    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
51        for i in 0..self.attrs.len() {
52            match write!(fmt, "{}", self.attrs[i]) {
53                Ok(_) => (),
54                Err(e) => return Err(e),
55            }
56        }
57        match self.base.clone() {
58            Some(b) => match writeln!(fmt, "{} struct {} : {} {{", self.visibility, self.name, b) {
59                Ok(_) => (),
60                Err(e) => return Err(e),
61            },
62            None => match writeln!(fmt, "{} struct {} {{", self.visibility, self.name) {
63                Ok(_) => (),
64                Err(e) => return Err(e),
65            },
66        }
67        for i in 0..self.properties.len() {
68            match writeln!(fmt, "{};", self.properties[i]) {
69                Ok(_) => (),
70                Err(e) => return Err(e),
71            }
72        }
73        match write!(fmt, "}}") {
74            Ok(_) => (),
75            Err(e) => return Err(e),
76        }
77
78        Ok(())
79    }
80}