Skip to main content

miden_mast_package/dependency/
resolver.rs

1use alloc::{collections::BTreeMap, sync::Arc};
2
3use miden_assembly_syntax::Library;
4
5use crate::{Dependency, Package, Word};
6
7// DEPENDENCY RESOLUTION
8// ================================================================================================
9
10/// Resolved dependency
11/// In the future, we intend to add Registry variant to describe dependencies to be loaded from the
12/// registry.
13#[derive(Debug, Clone)]
14pub enum ResolvedDependency {
15    /// Loaded dependency (library, package, etc.)
16    Local(LocalResolvedDependency),
17}
18
19impl From<Arc<Library>> for ResolvedDependency {
20    fn from(library: Arc<Library>) -> Self {
21        Self::Local(LocalResolvedDependency::Library(library))
22    }
23}
24
25impl From<Arc<Package>> for ResolvedDependency {
26    fn from(package: Arc<Package>) -> Self {
27        Self::Local(LocalResolvedDependency::Package(package))
28    }
29}
30
31/// Resolved local(loaded) dependency
32#[derive(Debug, Clone)]
33pub enum LocalResolvedDependency {
34    Library(Arc<Library>),
35    Package(Arc<Package>),
36}
37
38impl From<Arc<Library>> for LocalResolvedDependency {
39    fn from(library: Arc<Library>) -> Self {
40        Self::Library(library)
41    }
42}
43
44impl From<Arc<Package>> for LocalResolvedDependency {
45    fn from(package: Arc<Package>) -> Self {
46        Self::Package(package)
47    }
48}
49
50// RESOLVER
51// ================================================================================================
52
53pub trait DependencyResolver {
54    fn resolve(&self, dependency: &Dependency) -> Option<ResolvedDependency>;
55}
56
57#[derive(Debug, Default)]
58pub struct MemDependencyResolverByDigest {
59    resolved: BTreeMap<Word, ResolvedDependency>,
60}
61
62impl MemDependencyResolverByDigest {
63    pub fn add(&mut self, digest: Word, resolution: ResolvedDependency) {
64        self.resolved.insert(digest, resolution);
65    }
66}
67
68impl DependencyResolver for MemDependencyResolverByDigest {
69    fn resolve(&self, dependency: &Dependency) -> Option<ResolvedDependency> {
70        self.resolved.get(&dependency.digest).cloned()
71    }
72}