miden_assembly_syntax/library/
module.rs

1use alloc::{sync::Arc, vec::Vec};
2
3use midenc_hir_type::FunctionType;
4
5use super::LibraryPath;
6use crate::{
7    Word,
8    ast::{ProcedureIndex, ProcedureName},
9};
10
11// MODULE INFO
12// ================================================================================================
13
14#[derive(Debug, Clone, PartialEq, Eq)]
15pub struct ModuleInfo {
16    path: LibraryPath,
17    procedures: Vec<ProcedureInfo>,
18}
19
20impl ModuleInfo {
21    /// Returns a new [`ModuleInfo`] instantiated library path.
22    pub fn new(path: LibraryPath) -> Self {
23        Self { path, procedures: Vec::new() }
24    }
25
26    /// Adds a procedure to the module.
27    pub fn add_procedure(
28        &mut self,
29        name: ProcedureName,
30        digest: Word,
31        signature: Option<Arc<FunctionType>>,
32    ) {
33        self.procedures.push(ProcedureInfo { name, digest, signature });
34    }
35
36    /// Returns the module's library path.
37    pub fn path(&self) -> &LibraryPath {
38        &self.path
39    }
40
41    /// Returns the number of procedures in the module.
42    pub fn num_procedures(&self) -> usize {
43        self.procedures.len()
44    }
45
46    /// Returns the [`ProcedureInfo`] of the procedure at the provided index, if any.
47    pub fn get_procedure_by_index(&self, index: ProcedureIndex) -> Option<&ProcedureInfo> {
48        self.procedures.get(index.as_usize())
49    }
50
51    /// Returns the digest of the procedure with the provided name, if any.
52    pub fn get_procedure_digest_by_name(&self, name: &ProcedureName) -> Option<Word> {
53        self.procedures.iter().find_map(|proc_info| {
54            if &proc_info.name == name {
55                Some(proc_info.digest)
56            } else {
57                None
58            }
59        })
60    }
61
62    /// Returns an iterator over the procedure infos in the module with their corresponding
63    /// procedure index in the module.
64    pub fn procedures(&self) -> impl Iterator<Item = (ProcedureIndex, &ProcedureInfo)> {
65        self.procedures
66            .iter()
67            .enumerate()
68            .map(|(idx, proc)| (ProcedureIndex::new(idx), proc))
69    }
70
71    /// Returns an iterator over the MAST roots of procedures defined in this module.
72    pub fn procedure_digests(&self) -> impl Iterator<Item = Word> + '_ {
73        self.procedures.iter().map(|p| p.digest)
74    }
75}
76
77/// Stores the name and digest of a procedure.
78#[derive(Debug, Clone, PartialEq, Eq)]
79pub struct ProcedureInfo {
80    pub name: ProcedureName,
81    pub digest: Word,
82    pub signature: Option<Arc<FunctionType>>,
83}