1pub mod builder;
2pub mod codegen;
3pub mod domain;
4pub mod io;
5
6use domain::{ElfMagicError, GenerationResult};
7use std::{env, path::PathBuf};
8
9use crate::domain::ProgramFilter;
10
11pub fn generate() -> Result<GenerationResult, ElfMagicError> {
21 let cargo_manifest_dir = env::var("CARGO_MANIFEST_DIR")
22 .map(PathBuf::from)
23 .map_err(|e| {
24 ElfMagicError::WorkspaceDiscovery(format!("CARGO_MANIFEST_DIR not set: {}", e))
25 })?;
26
27 let cargo_target_dir = env::var("CARGO_TARGET_DIR")
28 .map(PathBuf::from)
29 .unwrap_or_else(|_| env::temp_dir().join("elf-magic-target"));
30
31 let workspace = io::discover_workspace(&cargo_manifest_dir)?;
32
33 let manifest_config = io::parse_manifest_config(&cargo_manifest_dir)?;
34 let filter = ProgramFilter::from(&manifest_config);
35 let programs = workspace.find_solana_programs(&filter);
36
37 builder::build_programs(&cargo_target_dir, &programs)?;
38
39 io::write_lib_file(&cargo_manifest_dir, &programs)?;
40
41 io::setup_incremental_builds(&programs)?;
42
43 Ok(GenerationResult::new(programs))
44}
45
46#[cfg(feature = "testing")]
48pub fn generate_with_manifest_dir(
49 cargo_manifest_dir: &str,
50) -> Result<GenerationResult, ElfMagicError> {
51 temp_env::with_var("CARGO_MANIFEST_DIR", Some(cargo_manifest_dir), generate)
52}