Skip to main content

split_resolved_packages

Function split_resolved_packages 

Source
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"
);