miden_assembly_syntax/library/
module.rs1use alloc::vec::Vec;
2
3use super::LibraryPath;
4use crate::{
5 Word,
6 ast::{ProcedureIndex, ProcedureName},
7};
8
9#[derive(Debug, Clone, PartialEq, Eq)]
13pub struct ModuleInfo {
14 path: LibraryPath,
15 procedures: Vec<ProcedureInfo>,
16}
17
18impl ModuleInfo {
19 pub fn new(path: LibraryPath) -> Self {
21 Self { path, procedures: Vec::new() }
22 }
23
24 pub fn add_procedure(&mut self, name: ProcedureName, digest: Word) {
26 self.procedures.push(ProcedureInfo { name, digest });
27 }
28
29 pub fn path(&self) -> &LibraryPath {
31 &self.path
32 }
33
34 pub fn num_procedures(&self) -> usize {
36 self.procedures.len()
37 }
38
39 pub fn get_procedure_by_index(&self, index: ProcedureIndex) -> Option<&ProcedureInfo> {
41 self.procedures.get(index.as_usize())
42 }
43
44 pub fn get_procedure_digest_by_name(&self, name: &ProcedureName) -> Option<Word> {
46 self.procedures.iter().find_map(|proc_info| {
47 if &proc_info.name == name {
48 Some(proc_info.digest)
49 } else {
50 None
51 }
52 })
53 }
54
55 pub fn procedures(&self) -> impl Iterator<Item = (ProcedureIndex, &ProcedureInfo)> {
58 self.procedures
59 .iter()
60 .enumerate()
61 .map(|(idx, proc)| (ProcedureIndex::new(idx), proc))
62 }
63
64 pub fn procedure_digests(&self) -> impl Iterator<Item = Word> + '_ {
66 self.procedures.iter().map(|p| p.digest)
67 }
68}
69
70#[derive(Debug, Clone, PartialEq, Eq)]
72pub struct ProcedureInfo {
73 pub name: ProcedureName,
74 pub digest: Word,
75}