miden_mast_package/package/
manifest.rs1use alloc::{collections::BTreeMap, vec::Vec};
2use core::fmt;
3
4use miden_assembly_syntax::ast::{AttributeSet, QualifiedProcedureName, types::FunctionType};
5use miden_core::{Word, utils::DisplayHex};
6#[cfg(feature = "serde")]
7use serde::{Deserialize, Serialize};
8
9use crate::Dependency;
10
11#[derive(Debug, Default, Clone, PartialEq, Eq)]
17#[cfg_attr(feature = "arbitrary", derive(proptest_derive::Arbitrary))]
18pub struct PackageManifest {
19 pub(super) exports: BTreeMap<QualifiedProcedureName, PackageExport>,
21 pub(super) dependencies: Vec<Dependency>,
24}
25
26impl PackageManifest {
27 pub fn new(exports: impl IntoIterator<Item = PackageExport>) -> Self {
28 let exports = exports.into_iter().map(|export| (export.name.clone(), export)).collect();
29 Self {
30 exports,
31 dependencies: Default::default(),
32 }
33 }
34
35 pub fn with_dependencies(mut self, dependencies: impl IntoIterator<Item = Dependency>) -> Self {
37 self.dependencies.extend(dependencies);
38 self
39 }
40
41 pub fn add_dependency(&mut self, dependency: Dependency) {
43 self.dependencies.push(dependency);
44 }
45
46 pub fn num_dependencies(&self) -> usize {
48 self.dependencies.len()
49 }
50
51 pub fn dependencies(&self) -> impl Iterator<Item = &Dependency> {
53 self.dependencies.iter()
54 }
55
56 pub fn num_exports(&self) -> usize {
58 self.exports.len()
59 }
60
61 pub fn exports(&self) -> impl Iterator<Item = &PackageExport> {
63 self.exports.values()
64 }
65
66 pub fn get_export(&self, name: &QualifiedProcedureName) -> Option<&PackageExport> {
68 self.exports.get(name)
69 }
70
71 pub fn get_exports_by_digest(
73 &self,
74 digest: &Word,
75 ) -> impl Iterator<Item = &PackageExport> + '_ {
76 let digest = *digest;
77 self.exports.values().filter(move |export| export.digest == digest)
78 }
79}
80
81#[derive(Clone, PartialEq, Eq)]
84#[cfg_attr(feature = "arbitrary", derive(proptest_derive::Arbitrary))]
85#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
86#[cfg_attr(all(feature = "arbitrary", test), miden_test_serde_macros::serde_test)]
87pub struct PackageExport {
88 pub name: QualifiedProcedureName,
90 #[cfg_attr(feature = "arbitrary", proptest(value = "Word::default()"))]
92 pub digest: Word,
93 #[cfg_attr(feature = "arbitrary", proptest(value = "None"))]
95 #[cfg_attr(feature = "serde", serde(default))]
96 pub signature: Option<FunctionType>,
97 #[cfg_attr(feature = "arbitrary", proptest(value = "AttributeSet::default()"))]
99 #[cfg_attr(feature = "serde", serde(default))]
100 pub attributes: AttributeSet,
101}
102
103impl fmt::Debug for PackageExport {
104 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
105 let Self { name, digest, signature, attributes } = self;
106 f.debug_struct("PackageExport")
107 .field("name", &format_args!("{name}"))
108 .field("digest", &format_args!("{}", DisplayHex::new(&digest.as_bytes())))
109 .field("signature", signature)
110 .field("attributes", attributes)
111 .finish()
112 }
113}