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 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}