miden_assembly_syntax/library/
module.rs1use 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#[derive(Debug, Clone, PartialEq, Eq)]
15pub struct ModuleInfo {
16 path: LibraryPath,
17 procedures: Vec<ProcedureInfo>,
18}
19
20impl ModuleInfo {
21 pub fn new(path: LibraryPath) -> Self {
23 Self { path, procedures: Vec::new() }
24 }
25
26 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 pub fn path(&self) -> &LibraryPath {
38 &self.path
39 }
40
41 pub fn num_procedures(&self) -> usize {
43 self.procedures.len()
44 }
45
46 pub fn get_procedure_by_index(&self, index: ProcedureIndex) -> Option<&ProcedureInfo> {
48 self.procedures.get(index.as_usize())
49 }
50
51 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 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 pub fn procedure_digests(&self) -> impl Iterator<Item = Word> + '_ {
73 self.procedures.iter().map(|p| p.digest)
74 }
75}
76
77#[derive(Debug, Clone, PartialEq, Eq)]
79pub struct ProcedureInfo {
80 pub name: ProcedureName,
81 pub digest: Word,
82 pub signature: Option<Arc<FunctionType>>,
83}