oag_typescript/
generator.rs1use 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#[derive(Debug, Clone, Default)]
16pub struct TypeScriptConfig {
17 pub base_url: Option<String>,
18 pub no_jsdoc: bool,
19 pub scaffold: Option<ScaffoldOptions>,
21}
22
23pub 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}