use alloc::vec::Vec;
use super::LibraryPath;
use crate::{
ast::{ProcedureIndex, ProcedureName},
RpoDigest,
};
#[derive(Debug, Clone)]
pub struct ModuleInfo {
path: LibraryPath,
procedures: Vec<ProcedureInfo>,
}
impl ModuleInfo {
pub fn new(path: LibraryPath) -> Self {
Self { path, procedures: Vec::new() }
}
pub fn add_procedure(&mut self, name: ProcedureName, digest: RpoDigest) {
self.procedures.push(ProcedureInfo { name, digest });
}
pub fn path(&self) -> &LibraryPath {
&self.path
}
pub fn num_procedures(&self) -> usize {
self.procedures.len()
}
pub fn get_procedure_by_index(&self, index: ProcedureIndex) -> Option<&ProcedureInfo> {
self.procedures.get(index.as_usize())
}
pub fn get_procedure_digest_by_name(&self, name: &ProcedureName) -> Option<RpoDigest> {
self.procedures.iter().find_map(|proc_info| {
if &proc_info.name == name {
Some(proc_info.digest)
} else {
None
}
})
}
pub fn procedures(&self) -> impl Iterator<Item = (ProcedureIndex, &ProcedureInfo)> {
self.procedures
.iter()
.enumerate()
.map(|(idx, proc)| (ProcedureIndex::new(idx), proc))
}
pub fn procedure_digests(&self) -> impl Iterator<Item = RpoDigest> + '_ {
self.procedures.iter().map(|p| p.digest)
}
}
#[derive(Debug, Clone)]
pub struct ProcedureInfo {
pub name: ProcedureName,
pub digest: RpoDigest,
}