schemajen/codegen/
typescript.rs

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