Archived
41 lines
1.2 KiB
Rust
41 lines
1.2 KiB
Rust
//! Dependency resolution — convert a manifest's dependency map into a flat
|
|
//! ordered list of resolved packages.
|
|
|
|
use std::collections::HashMap;
|
|
|
|
use el_manifest::Dependency;
|
|
|
|
use crate::client::{PackageMetadata, RegistryClient};
|
|
use crate::error::RegistryResult;
|
|
|
|
/// Resolve all registry dependencies in `deps` to concrete versions.
|
|
///
|
|
/// Path dependencies are skipped (they are local and do not need network
|
|
/// resolution).
|
|
pub async fn resolve_deps(
|
|
client: &RegistryClient,
|
|
deps: &HashMap<String, Dependency>,
|
|
) -> RegistryResult<Vec<PackageMetadata>> {
|
|
let mut resolved = Vec::new();
|
|
|
|
for (name, dep) in deps {
|
|
match dep {
|
|
Dependency::VersionReq(req) => {
|
|
let meta = client.fetch_metadata(name, req).await?;
|
|
resolved.push(meta);
|
|
}
|
|
Dependency::Registry { version, .. } => {
|
|
let meta = client.fetch_metadata(name, version).await?;
|
|
resolved.push(meta);
|
|
}
|
|
Dependency::Path(_) => {
|
|
// Path deps resolve to the local directory — nothing to fetch.
|
|
}
|
|
}
|
|
}
|
|
|
|
// Sort by name for deterministic ordering.
|
|
resolved.sort_by(|a, b| a.name.cmp(&b.name));
|
|
Ok(resolved)
|
|
}
|