elif_codegen/
lib.rs

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}