oag_fastapi_server/
generator.rs1use 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
8pub 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 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}