Skip to main content

runmat_package/graph/
visibility.rs

1use 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}