use std::collections::HashSet;
use std::path::Path;
use std::process::Command;
pub fn resolve_real_deps(manifest_path: &Path) -> Option<HashSet<String>> {
let output = Command::new("cargo")
.args([
"tree",
"--prefix",
"none",
"-e",
"normal,build",
"--format",
"{p}",
"--manifest-path",
])
.arg(manifest_path)
.output()
.ok()?;
if !output.status.success() {
return None;
}
let stdout = String::from_utf8_lossy(&output.stdout);
let mut set = HashSet::new();
for line in stdout.lines() {
let line = line.trim();
if line.is_empty() {
continue;
}
let parts: Vec<&str> = line.split_whitespace().collect();
if parts.len() >= 2 {
let name = parts[0];
let version = parts[1].strip_prefix('v').unwrap_or(parts[1]);
set.insert(format!("{name} {version}"));
}
}
if set.is_empty() {
None
} else {
Some(set)
}
}
pub fn is_real_dep(real_deps: &Option<HashSet<String>>, name: &str, version: &str) -> bool {
match real_deps {
Some(set) => set.contains(&format!("{name} {version}")),
None => true,
}
}