pub fn split_resolved_packages(
resolved: &ResolvedPackages,
) -> (HashMap<PackageName, ConcreteVersion>, HashMap<PackageName, Vec<ConcreteVersion>>)Expand description
Splits a parsed deps_core::lockfile::ResolvedPackages into two maps.
The collapsed dep_name -> version map (ResolvedPackages::iter, unchanged FR-005 fast
path) and a sibling dep_name -> [version, ...] map (issue #649) holding every retained
lock-file entry for names with more than one — built from ResolvedPackages::iter_all,
and deliberately omitting a single-occurrence name entirely (NFR-003: the common case
never pays for a candidates-map lookup).
Shared by both LockfileLoad::Loaded constructors: parse_known_lockfile (and thus
load_resolved_versions) and deps-lsp’s watched-lock-file-change handler, which calls
parse_known_lockfile directly — both re-parse a lock file and need the identical
split.
§Examples
use deps_core::lockfile::{ResolvedPackage, ResolvedPackages, ResolvedSource};
use deps_engine::classify::resolved::split_resolved_packages;
let mut resolved = ResolvedPackages::new();
resolved.insert(ResolvedPackage::new(
"serde".into(),
"1.0.195".into(),
ResolvedSource::Registry {
url: "https://github.com/rust-lang/crates.io-index".into(),
checksum: "abc123".into(),
},
));
let (versions, candidates) = split_resolved_packages(&resolved);
assert_eq!(versions.len(), 1);
assert!(
candidates.is_empty(),
"a single-occurrence name has no candidates entry"
);