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}