schemajen/codegen/
typescript.rs1use super::*;
2
3#[derive(Default)]
4pub struct TypescriptAccumulator {
5 struct_stack: Vec<String>,
6 done_list: Vec<String>,
7}
8
9impl TypescriptAccumulator {
10 pub fn begin() -> Self {
11 TypescriptAccumulator::default()
12 }
13
14 fn get_current(&mut self) -> &mut String {
15 self.struct_stack.last_mut().unwrap()
16 }
17
18 fn get_type(ty: JsonType) -> String {
19 match ty {
20 JsonType::Null => String::from("unknown"),
21 JsonType::Number(_) => String::from("number"),
22 JsonType::Boolean => String::from("boolean"),
23 JsonType::String => String::from("string"),
24 JsonType::Object(ty) => ty,
25 JsonType::Array(ty) => format!("{}[]", Self::get_type(*ty)),
26 }
27 }
28}
29
30impl TypeAccumulator for TypescriptAccumulator {
31 fn end(&mut self) -> String {
32 let mut end_str = String::new();
33
34 self.done_list.iter().for_each(|done| end_str += done);
35
36 end_str
37 }
38
39 fn number(&mut self, key: &str, _: Number) -> Result<(), Error> {
40 let acc = self.get_current();
41 *acc += &format!("\t{}: number;\n", key);
42 Ok(())
43 }
44
45 fn boolean(&mut self, key: &str) -> Result<(), Error> {
46 let acc = self.get_current();
47 *acc += &format!("\t{}: boolean;\n", key);
48 Ok(())
49 }
50
51 fn string(&mut self, key: &str) -> Result<(), Error> {
52 let acc = self.get_current();
53 *acc += &format!("\t{}: string;\n", key);
54 Ok(())
55 }
56
57 fn unknown(&mut self, key: &str) -> Result<(), Error> {
58 let acc = self.get_current();
59 *acc += &format!("\t{}: unknown;\n", key);
60 Ok(())
61 }
62
63 fn array(&mut self, key: &str, ty: JsonType) -> Result<(), Error> {
64 let ty = Self::get_type(ty);
65 let acc = self.get_current();
66 *acc += &format!("\t{}: {}[];\n", key, ty);
67 Ok(())
68 }
69
70 fn object(&mut self, key: &str, object_name: &str) -> Result<(), Error> {
71 let acc = self.get_current();
72 *acc += &format!("\t{}: {};\n", key, object_name);
73 Ok(())
74 }
75
76 fn push_object_type(&mut self, object_name: &str) -> Result<(), Error> {
77 self.struct_stack.push(String::new());
78 let acc = self.get_current();
79 *acc += &format!("type {} = {{\n", object_name);
80 Ok(())
81 }
82
83 fn pop_object_type(&mut self) -> Result<(), Error> {
84 let acc = self.get_current();
85 *acc += "}\n\n";
86 let s = self.struct_stack.pop().unwrap();
87 self.done_list.push(s);
88 Ok(())
89 }
90
91 fn prefered_object_name(&self) -> String {
92 String::from("_Type")
93 }
94}