use std::collections::HashMap;
use std::path::PathBuf;
use consortium_cfg_common::config::VisibleCore;
use super::PipelineError;
pub fn resolve_dbg_elf_paths(
firmware_outputs: &HashMap<VisibleCore, PathBuf>,
dbg_cores: impl Iterator<Item = VisibleCore>,
) -> Result<HashMap<VisibleCore, PathBuf>, PipelineError> {
let mut resolved = HashMap::new();
for core in dbg_cores {
let path = firmware_outputs
.get(&core)
.ok_or_else(|| PipelineError::DbgCoreNotBuilt(core.to_string()))?;
let absolute = std::path::absolute(path).unwrap_or_else(|_| path.clone());
resolved.insert(core, absolute);
}
Ok(resolved)
}
#[cfg(test)]
mod tests {
use super::*;
fn cm33() -> VisibleCore {
VisibleCore::Mcore("cm33".parse().unwrap())
}
fn cm0p() -> VisibleCore {
VisibleCore::Mcore("cm0p".parse().unwrap())
}
#[test]
fn resolves_paths_for_built_cores() {
let outputs = HashMap::from([(cm33(), PathBuf::from("/build/cm33.elf"))]);
let resolved =
resolve_dbg_elf_paths(&outputs, [cm33()].into_iter()).expect("cm33 was built");
assert_eq!(resolved[&cm33()], PathBuf::from("/build/cm33.elf"));
}
#[test]
fn errors_when_dbg_core_was_not_built() {
let outputs = HashMap::from([(cm33(), PathBuf::from("/build/cm33.elf"))]);
let err = resolve_dbg_elf_paths(&outputs, [cm0p()].into_iter())
.expect_err("cm0p has no firmware output");
assert!(matches!(err, PipelineError::DbgCoreNotBuilt(core) if core == "cm0p"));
}
}