Skip to main content

oag_fastapi_server/emitters/
scaffold.rs

1use minijinja::{Environment, context};
2use oag_core::GeneratedFile;
3use oag_core::config::ToolSetting;
4use serde::Deserialize;
5
6/// FastAPI-specific scaffold configuration, parsed from the opaque `serde_json::Value`.
7#[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
15/// Emit scaffold files for the FastAPI server (pyproject.toml, optionally ruff.toml).
16pub 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    // pyproject.toml
24    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    // ruff.toml (optional)
40    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}