use ggen_core::ontology_pack::OntologySchema;
use ggen_utils::error::{Error, Result};
use std::path::PathBuf;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct GenerateInput {
pub schema: OntologySchema,
pub language: String,
pub features: Vec<String>,
pub output_dir: PathBuf,
pub template_path: Option<PathBuf>,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct GenerateOutput {
pub files_generated: Vec<PathBuf>,
pub primary_file: PathBuf,
pub stats: GenerationStats,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct GenerationStats {
pub types_generated: usize,
pub validators_generated: usize,
pub utilities_generated: usize,
pub lines_of_code: usize,
}
pub async fn execute_generate(input: &GenerateInput) -> Result<GenerateOutput> {
tokio::fs::create_dir_all(&input.output_dir).await?;
let template_dir = input
.template_path
.as_ref()
.ok_or_else(|| Error::new("Template path required"))?;
if !template_dir.exists() {
return Err(Error::new(&format!(
"Template directory not found: {}",
template_dir.display()
)));
}
let mut files = Vec::new();
let primary_file = input.output_dir.join("types.ts");
let index_content = format!(
"// Generated from {} ontology\n// Language: {}\n// Features: {}\n",
input.schema.namespace,
input.language,
input.features.join(", ")
);
tokio::fs::write(&primary_file, index_content).await?;
files.push(primary_file.clone());
let stats = GenerationStats {
types_generated: input.schema.classes.len(),
validators_generated: if input.features.contains(&"zod".to_string()) {
input.schema.classes.len()
} else {
0
},
utilities_generated: if input.features.contains(&"utilities".to_string()) {
1
} else {
0
},
lines_of_code: 0,
};
Ok(GenerateOutput {
files_generated: files.clone(),
primary_file,
stats,
})
}
#[cfg(test)]
mod tests {
use super::*;
use ggen_core::ontology_pack::OntologySchema;
#[tokio::test]
async fn test_generate_creates_output_dir() {
let temp_dir = tempfile::tempdir().unwrap();
let output_dir = temp_dir.path().join("generated");
let template_dir = tempfile::tempdir().unwrap();
let input = GenerateInput {
schema: OntologySchema {
namespace: "https://schema.org/".to_string(),
classes: vec![],
properties: vec![],
relationships: vec![],
prefixes: Default::default(),
},
language: "typescript".to_string(),
features: vec![],
output_dir: output_dir.clone(),
template_path: Some(template_dir.path().to_path_buf()),
};
let result = execute_generate(&input).await;
assert!(result.is_ok());
assert!(output_dir.exists());
}
}