1pub mod generator;
2pub mod templates;
3pub mod writer;
4
5pub use generator::*;
6pub use writer::*;
7
8use elif_core::{ElifError, ResourceSpec};
9use std::path::PathBuf;
10
11pub struct CodeGenerator {
12 pub project_root: PathBuf,
13}
14
15impl CodeGenerator {
16 pub fn new(project_root: PathBuf) -> Self {
17 Self { project_root }
18 }
19
20 pub fn generate_all(&self) -> Result<(), ElifError> {
21 let resources_dir = self.project_root.join("resources");
22 if !resources_dir.exists() {
23 return Ok(());
24 }
25
26 for entry in std::fs::read_dir(&resources_dir)? {
27 let entry = entry?;
28 let path = entry.path();
29 if path.extension().map_or(false, |ext| ext == "yaml") &&
30 path.file_stem().and_then(|s| s.to_str())
31 .map_or(false, |s| s.ends_with(".resource")) {
32
33 let content = std::fs::read_to_string(&path)?;
34 let spec = ResourceSpec::from_yaml(&content)?;
35 self.generate_resource(&spec)?;
36 }
37 }
38
39 Ok(())
40 }
41
42 pub fn generate_resource(&self, spec: &ResourceSpec) -> Result<(), ElifError> {
43 let generator = ResourceGenerator::new(&self.project_root, spec);
44
45 generator.generate_model()?;
46 generator.generate_handler()?;
47 generator.generate_migration()?;
48 generator.generate_test()?;
49
50 Ok(())
51 }
52}