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}