codeviz_js/
class_spec.rs

1use super::*;
2
3#[derive(Debug, Clone)]
4pub struct ClassSpec {
5    pub name: String,
6    pub constructors: Elements,
7    pub elements: Elements,
8    pub export: bool,
9}
10
11impl ClassSpec {
12    pub fn new(name: &str) -> ClassSpec {
13        ClassSpec {
14            name: name.to_owned(),
15            constructors: Elements::new(),
16            elements: Elements::new(),
17            export: false,
18        }
19    }
20
21    pub fn export(&mut self) {
22        self.export = true;
23    }
24
25    pub fn push_constructor<E>(&mut self, element: E)
26    where
27        E: Into<Element>,
28    {
29        self.constructors.push(element);
30    }
31
32    pub fn push<E>(&mut self, element: E)
33    where
34        E: Into<Element>,
35    {
36        self.elements.push(element);
37    }
38}
39
40impl From<ClassSpec> for Element {
41    fn from(value: ClassSpec) -> Element {
42        let mut open = Statement::new();
43
44        if value.export {
45            open.push("export ");
46        }
47
48        open.push("class ");
49        open.push(value.name);
50        open.push(" {");
51
52        let mut body = Elements::new();
53
54        if !value.constructors.is_empty() {
55            body.push(value.constructors.join(Spacing));
56        }
57
58        if !value.elements.is_empty() {
59            body.push(value.elements.join(Spacing));
60        }
61
62        let mut out = Elements::new();
63        out.push(open);
64        out.push_nested(body.join(Spacing));
65        out.push("}");
66
67        out.into()
68    }
69}