baobao_codegen_typescript/
type_mapper.rs

1//! TypeScript type mapper implementation.
2
3use baobao_codegen::language::TypeMapper;
4use baobao_core::{ArgType, ContextFieldType, DatabaseType};
5
6/// TypeScript type mapper implementation.
7pub struct TypeScriptTypeMapper;
8
9impl TypeMapper for TypeScriptTypeMapper {
10    fn language(&self) -> &'static str {
11        "typescript"
12    }
13
14    fn map_arg_type(&self, arg_type: ArgType) -> &'static str {
15        match arg_type {
16            ArgType::String => "string",
17            ArgType::Int => "number",
18            ArgType::Float => "number",
19            ArgType::Bool => "boolean",
20            ArgType::Path => "string",
21        }
22    }
23
24    fn map_optional_arg_type(&self, arg_type: ArgType) -> String {
25        format!("{} | undefined", self.map_arg_type(arg_type))
26    }
27
28    fn map_context_type(&self, field_type: &ContextFieldType) -> &'static str {
29        match field_type {
30            // Bun's native SQLite
31            ContextFieldType::Database(DatabaseType::Sqlite) => "Database",
32            // For Postgres/MySQL, we'll use placeholder types for now
33            ContextFieldType::Database(DatabaseType::Postgres) => "unknown",
34            ContextFieldType::Database(DatabaseType::Mysql) => "unknown",
35            ContextFieldType::Http => "unknown",
36        }
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn test_typescript_arg_types() {
46        let mapper = TypeScriptTypeMapper;
47
48        assert_eq!(mapper.map_arg_type(ArgType::String), "string");
49        assert_eq!(mapper.map_arg_type(ArgType::Int), "number");
50        assert_eq!(mapper.map_arg_type(ArgType::Float), "number");
51        assert_eq!(mapper.map_arg_type(ArgType::Bool), "boolean");
52        assert_eq!(mapper.map_arg_type(ArgType::Path), "string");
53    }
54
55    #[test]
56    fn test_typescript_optional_types() {
57        let mapper = TypeScriptTypeMapper;
58
59        assert_eq!(
60            mapper.map_optional_arg_type(ArgType::String),
61            "string | undefined"
62        );
63        assert_eq!(
64            mapper.map_optional_arg_type(ArgType::Int),
65            "number | undefined"
66        );
67    }
68
69    #[test]
70    fn test_typescript_context_types() {
71        let mapper = TypeScriptTypeMapper;
72
73        assert_eq!(
74            mapper.map_context_type(&ContextFieldType::Database(DatabaseType::Sqlite)),
75            "Database"
76        );
77    }
78}