oag_fastapi_server/emitters/
scaffold.rs1use minijinja::{Environment, context};
2use oag_core::GeneratedFile;
3use oag_core::config::ToolSetting;
4use serde::Deserialize;
5
6#[derive(Debug, Clone, Default, Deserialize)]
8#[serde(default)]
9pub struct FastapiScaffoldConfig {
10 pub package_name: Option<String>,
11 pub formatter: Option<ToolSetting>,
12 pub test_runner: Option<ToolSetting>,
13}
14
15pub fn emit_scaffold(config: &FastapiScaffoldConfig) -> Vec<GeneratedFile> {
17 let mut files = Vec::new();
18
19 let name = config.package_name.as_deref().unwrap_or("generated-server");
20 let ruff = ToolSetting::resolve(config.formatter.as_ref(), "ruff") == Some("ruff");
21 let pytest = ToolSetting::resolve(config.test_runner.as_ref(), "pytest") == Some("pytest");
22
23 let mut env = Environment::new();
25 env.add_template(
26 "pyproject.toml.j2",
27 include_str!("../../templates/pyproject.toml.j2"),
28 )
29 .expect("template should be valid");
30 let tmpl = env.get_template("pyproject.toml.j2").unwrap();
31
32 files.push(GeneratedFile {
33 path: "pyproject.toml".to_string(),
34 content: tmpl
35 .render(context! { name => name, pytest => pytest, ruff => ruff })
36 .expect("render should succeed"),
37 });
38
39 if ruff {
41 files.push(GeneratedFile {
42 path: "ruff.toml".to_string(),
43 content: include_str!("../../templates/ruff.toml.j2").to_string(),
44 });
45 }
46
47 files
48}