callisto_graph/
resolver.rs1use 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 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}