pub mod builder;
pub mod codegen;
pub mod domain;
pub mod io;
use domain::{ElfMagicError, GenerationResult};
use std::{env, path::PathBuf};
use crate::domain::ProgramFilter;
pub fn generate() -> Result<GenerationResult, ElfMagicError> {
let cargo_manifest_dir = env::var("CARGO_MANIFEST_DIR")
.map(PathBuf::from)
.map_err(|e| {
ElfMagicError::WorkspaceDiscovery(format!("CARGO_MANIFEST_DIR not set: {}", e))
})?;
let cargo_target_dir = env::var("CARGO_TARGET_DIR")
.map(PathBuf::from)
.unwrap_or_else(|_| env::temp_dir().join("elf-magic-target"));
let workspace = io::discover_workspace(&cargo_manifest_dir)?;
let manifest_config = io::parse_manifest_config(&cargo_manifest_dir)?;
let filter = ProgramFilter::from(&manifest_config);
let programs = workspace.find_solana_programs(&filter);
builder::build_programs(&cargo_target_dir, &programs)?;
io::write_lib_file(&cargo_manifest_dir, &programs)?;
io::setup_incremental_builds(&programs)?;
Ok(GenerationResult::new(programs))
}
#[cfg(feature = "testing")]
pub fn generate_with_manifest_dir(
cargo_manifest_dir: &str,
) -> Result<GenerationResult, ElfMagicError> {
temp_env::with_var("CARGO_MANIFEST_DIR", Some(cargo_manifest_dir), generate)
}