Skip to main content

oag_fastapi_server/
generator.rs

1use oag_core::config::{GeneratorConfig, GeneratorId, ToolSetting};
2use oag_core::ir::IrSpec;
3use oag_core::{CodeGenerator, GeneratedFile, GeneratorError};
4
5use crate::emitters;
6use crate::emitters::scaffold::FastapiScaffoldConfig;
7
8/// FastAPI server stub generator.
9pub struct FastapiServerGenerator;
10
11impl CodeGenerator for FastapiServerGenerator {
12    fn id(&self) -> GeneratorId {
13        GeneratorId::FastapiServer
14    }
15
16    fn generate(
17        &self,
18        ir: &IrSpec,
19        config: &GeneratorConfig,
20    ) -> Result<Vec<GeneratedFile>, GeneratorError> {
21        let mut files = vec![
22            GeneratedFile {
23                path: "models.py".to_string(),
24                content: emitters::models::emit_models(ir),
25            },
26            GeneratedFile {
27                path: "routes.py".to_string(),
28                content: emitters::routes::emit_routes(ir),
29            },
30            GeneratedFile {
31                path: "sse.py".to_string(),
32                content: emitters::sse::emit_sse(),
33            },
34            GeneratedFile {
35                path: "main.py".to_string(),
36                content: emitters::app::emit_app(),
37            },
38            GeneratedFile {
39                path: "__init__.py".to_string(),
40                content: String::new(),
41            },
42        ];
43
44        // Add scaffold (pyproject.toml, optionally ruff.toml)
45        if let Some(ref raw) = config.scaffold {
46            let scaffold: FastapiScaffoldConfig = serde_json::from_value(raw.clone())
47                .map_err(|e| GeneratorError::Other(format!("invalid scaffold config: {e}")))?;
48            files.extend(emitters::scaffold::emit_scaffold(&scaffold));
49
50            if ToolSetting::resolve(scaffold.test_runner.as_ref(), "pytest").is_some() {
51                files.extend(emitters::tests::emit_tests(ir));
52            }
53        }
54
55        Ok(files)
56    }
57}