espforge_lib/compile/
mod.rs

1use anyhow::{Error, Result};
2use std::path::{Path, PathBuf};
3
4mod validation;
5mod context;
6mod scripting;
7mod template;
8mod postprocess;
9
10pub fn compile<P: AsRef<Path>>(path: P) -> Result<(), Error> {
11    let config_path = path.as_ref();
12    let config_dir = config_path.parent().unwrap_or_else(|| Path::new("."));
13    
14    let config = validation::load_and_validate(config_path)?;
15
16    let project_name = config.get_name();
17    crate::generate::generate(
18        project_name,
19        &config.get_platform(),
20        config.espforge.enable_async,
21    )?;
22
23    let project_path = PathBuf::from(project_name);
24    let src_path = project_path.join("src");
25
26    // Copy necessary infrastructure files
27    crate::generate::operations::copy_components(&src_path)?;
28    crate::generate::operations::copy_platform_files(&src_path)?;
29    crate::generate::operations::copy_globals_files(&src_path)?;
30    crate::generate::operations::copy_devices(&src_path)?;
31
32    let mut tera_context = context::prepare_tera_context(&config)?;
33    context::resolve_application_logic(&config, config_dir, &mut tera_context)?;    
34    template::apply_templates(&config, &project_path, &tera_context)?;
35    
36    // Update Cargo.toml (Merge dependencies)
37    crate::generate::cargo::update_manifest(
38        &project_path,
39        config_dir,
40        config.espforge.platform.target(), 
41        &tera_context
42    )?;
43
44    postprocess::refine_project_files(&project_path, config_dir, &tera_context)?;
45
46    Ok(())
47}
48