tauri_plugin_typegen/
generator.rs

1use crate::analyzer::CommandAnalyzer;
2use crate::generators::{VanillaTypeScriptGenerator, ZodGenerator};
3use crate::models::{CommandInfo, StructInfo};
4use std::collections::HashMap;
5
6pub struct TypeScriptGenerator {
7    validation_library: String,
8}
9
10impl TypeScriptGenerator {
11    pub fn new(validation_library: Option<String>) -> Self {
12        Self {
13            validation_library: validation_library.unwrap_or_else(|| "zod".to_string()),
14        }
15    }
16
17    pub fn generate_models(
18        &mut self,
19        commands: &[CommandInfo],
20        discovered_structs: &HashMap<String, StructInfo>,
21        output_path: &str,
22        analyzer: &CommandAnalyzer,
23    ) -> Result<Vec<String>, Box<dyn std::error::Error>> {
24        match self.validation_library.as_str() {
25            "zod" => {
26                let mut generator = ZodGenerator::new();
27                generator.generate_models(commands, discovered_structs, output_path, analyzer)
28            }
29            "none" => {
30                let mut generator = VanillaTypeScriptGenerator::new();
31                generator.generate_models(commands, discovered_structs, output_path, analyzer)
32            }
33            _ => {
34                // For other validation libraries, fall back to vanilla
35                let mut generator = VanillaTypeScriptGenerator::new();
36                generator.generate_models(commands, discovered_structs, output_path, analyzer)
37            }
38        }
39    }
40
41    // Helper methods for testing - delegate to appropriate generator
42    pub fn to_pascal_case(&self, s: &str) -> String {
43        match self.validation_library.as_str() {
44            "zod" => {
45                let generator = ZodGenerator::new();
46                generator.to_pascal_case(s)
47            }
48            _ => {
49                let generator = VanillaTypeScriptGenerator::new();
50                generator.to_pascal_case(s)
51            }
52        }
53    }
54
55    pub fn to_camel_case(&self, s: &str) -> String {
56        match self.validation_library.as_str() {
57            "zod" => {
58                let generator = ZodGenerator::new();
59                generator.to_camel_case(s)
60            }
61            _ => {
62                let generator = VanillaTypeScriptGenerator::new();
63                generator.to_camel_case(s)
64            }
65        }
66    }
67
68    pub fn collect_referenced_types(&self, rust_type: &str, used_types: &mut std::collections::HashSet<String>) {
69        match self.validation_library.as_str() {
70            "zod" => {
71                let generator = ZodGenerator::new();
72                generator.collect_referenced_types(rust_type, used_types)
73            }
74            _ => {
75                let generator = VanillaTypeScriptGenerator::new();
76                generator.collect_referenced_types(rust_type, used_types)
77            }
78        }
79    }
80
81    pub fn typescript_to_zod_type(&self, ts_type: &str) -> String {
82        let generator = ZodGenerator::new();
83        generator.typescript_to_zod_type(ts_type)
84    }
85
86    pub fn typescript_to_yup_type(&self, ts_type: &str) -> String {
87        // Yup support removed
88        format!("yup.mixed() /* {} - yup support removed */", ts_type)
89    }
90
91    pub fn is_custom_type(&self, ts_type: &str) -> bool {
92        match self.validation_library.as_str() {
93            "zod" => {
94                let generator = ZodGenerator::new();
95                generator.is_custom_type(ts_type)
96            }
97            _ => {
98                let generator = VanillaTypeScriptGenerator::new();
99                generator.is_custom_type(ts_type)
100            }
101        }
102    }
103}