runmat_package/graph/
visibility.rs1use super::PackageGraph;
2use crate::ContentDigest;
3use std::collections::BTreeSet;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub enum VisibilityResolution {
7 Found(ContentDigest),
8 NotVisible,
9 Ambiguous(Vec<ContentDigest>),
10}
11
12pub(super) fn resolve(
13 graph: &PackageGraph,
14 requester: &ContentDigest,
15 candidates: impl IntoIterator<Item = ContentDigest>,
16) -> VisibilityResolution {
17 let candidates = candidates.into_iter().collect::<BTreeSet<_>>();
18 if candidates.contains(&graph.root) {
19 return VisibilityResolution::Found(graph.root.clone());
20 }
21 let visible = graph
22 .edges
23 .iter()
24 .filter(|edge| &edge.from == requester && candidates.contains(&edge.to))
25 .map(|edge| edge.to.clone())
26 .collect::<BTreeSet<_>>();
27 match visible.len() {
28 0 => VisibilityResolution::NotVisible,
29 1 => VisibilityResolution::Found(visible.into_iter().next().unwrap()),
30 _ => VisibilityResolution::Ambiguous(visible.into_iter().collect()),
31 }
32}