Skip to main content

oag_typescript/
generator.rs

1use oag_core::ir::IrSpec;
2use oag_core::{CodeGenerator, GeneratedFile};
3use thiserror::Error;
4
5use crate::emitters;
6use crate::emitters::scaffold::ScaffoldOptions;
7
8#[derive(Debug, Error)]
9pub enum TypeScriptError {
10    #[error("template render failed: {0}")]
11    Render(String),
12}
13
14/// Configuration for the TypeScript generator.
15#[derive(Debug, Clone, Default)]
16pub struct TypeScriptConfig {
17    pub base_url: Option<String>,
18    pub no_jsdoc: bool,
19    /// Generate scaffold files (package.json, tsconfig.json, etc).
20    pub scaffold: Option<ScaffoldOptions>,
21}
22
23/// TypeScript/Node code generator.
24pub struct TypeScriptGenerator;
25
26impl CodeGenerator for TypeScriptGenerator {
27    type Config = TypeScriptConfig;
28    type Error = TypeScriptError;
29
30    fn generate(
31        &self,
32        ir: &IrSpec,
33        config: &Self::Config,
34    ) -> Result<Vec<GeneratedFile>, Self::Error> {
35        let mut files = vec![
36            GeneratedFile {
37                path: "types.ts".to_string(),
38                content: emitters::types::emit_types(ir),
39            },
40            GeneratedFile {
41                path: "sse.ts".to_string(),
42                content: emitters::sse::emit_sse(),
43            },
44            GeneratedFile {
45                path: "client.ts".to_string(),
46                content: emitters::client::emit_client(ir, config.no_jsdoc),
47            },
48            GeneratedFile {
49                path: "index.ts".to_string(),
50                content: emitters::index::emit_index(),
51            },
52        ];
53
54        if let Some(ref scaffold) = config.scaffold {
55            files.extend(emitters::scaffold::emit_scaffold(scaffold));
56        }
57
58        Ok(files)
59    }
60}