use super::{GraphValidator, PackValidationError};
use crate::tree::PackGraph;
pub struct DependsOnValidator;
impl GraphValidator for DependsOnValidator {
fn name(&self) -> &'static str {
"depends_on_unsatisfied"
}
fn check(&self, graph: &PackGraph) -> Vec<PackValidationError> {
let mut errs = Vec::new();
for node in graph.nodes() {
for dep in &node.manifest.depends_on {
if !is_resolvable(graph, dep) {
errs.push(PackValidationError::DependsOnUnsatisfied {
pack: node.name.clone(),
required: dep.clone(),
});
}
}
}
errs
}
}
fn is_resolvable(graph: &PackGraph, dep: &str) -> bool {
if looks_like_url(dep) {
graph.nodes().iter().any(|n| n.source_url.as_deref() == Some(dep))
} else {
graph.find_by_name(dep).is_some()
}
}
fn looks_like_url(s: &str) -> bool {
s.starts_with("http://")
|| s.starts_with("https://")
|| s.starts_with("ssh://")
|| s.starts_with("git@")
|| s.ends_with(".git")
}