xenon_codegen/
impl.rs

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