espforge_lib/compile/
mod.rs1use 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 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 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