Skip to main content

callisto_graph/
resolver.rs

1use std::collections::BTreeMap;
2
3use callisto_model::{DepEdge, Diagnostic, Package, PackageId};
4
5use crate::identity::IdentityIndex;
6
7pub use callisto_model::DependencyResolver;
8
9pub struct ManifestWalkResolver {
10    pub(crate) packages: BTreeMap<PackageId, Package>,
11    pub(crate) edges: Vec<DepEdge>,
12    pub(crate) out_index: BTreeMap<PackageId, Vec<usize>>,
13    pub(crate) in_index: BTreeMap<PackageId, Vec<usize>>,
14    pub(crate) index: IdentityIndex,
15    pub(crate) diagnostics: Vec<Diagnostic>,
16}
17
18impl ManifestWalkResolver {
19    pub fn diagnostics(&self) -> &[Diagnostic] {
20        &self.diagnostics
21    }
22
23    pub fn identity(&self) -> &IdentityIndex {
24        &self.index
25    }
26
27    pub fn get(&self, id: &PackageId) -> Option<&Package> {
28        self.packages.get(id)
29    }
30
31    pub fn edges(&self) -> &[DepEdge] {
32        &self.edges
33    }
34}
35
36impl DependencyResolver for ManifestWalkResolver {
37    fn packages(&self) -> impl Iterator<Item = &Package> {
38        self.packages.values()
39    }
40
41    fn dependencies_of(&self, id: &PackageId) -> impl Iterator<Item = &DepEdge> {
42        // Avoid an intermediate Vec by streaming index lookups directly as edge references.
43        let edges = &self.edges;
44        self.out_index
45            .get(id)
46            .into_iter()
47            .flat_map(|v| v.iter())
48            .map(move |&idx| &edges[idx])
49    }
50
51    fn dependents_of(&self, id: &PackageId) -> impl Iterator<Item = &DepEdge> {
52        let edges = &self.edges;
53        self.in_index
54            .get(id)
55            .into_iter()
56            .flat_map(|v| v.iter())
57            .map(move |&idx| &edges[idx])
58    }
59
60    fn diagnostics(&self) -> &[Diagnostic] {
61        &self.diagnostics
62    }
63}