use std::sync::Arc;
use pubsat::builder::DependencyGraphBuilder;
use pubsat::registry::{MockRegistry, VersionMetadata};
use pubsat::resolver::DependencyResolver;
use pubsat::version::VersionSet;
use semver::Version;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let registry = Arc::new(
MockRegistry::new()
.with_versions("left-pad", &["1.0.0", "1.1.0", "1.3.0"])
.with_versions("chalk", &["4.1.0", "4.1.2", "5.0.0"])
.with_versions("ansi-styles", &["4.3.0", "5.2.0", "6.2.1"])
.with_dependency("chalk", "4.1.0", "ansi-styles", parse_set("^4.0.0"))
.with_dependency("chalk", "4.1.2", "ansi-styles", parse_set("^4.0.0"))
.with_dependency("chalk", "5.0.0", "ansi-styles", parse_set("^6.0.0")),
);
let root = VersionMetadata::new("my-app", Version::new(1, 0, 0))
.with_dependency("chalk", parse_set("^5.0.0"))
.with_dependency("left-pad", parse_set("^1.0.0"));
let mut builder = DependencyGraphBuilder::new(registry.clone());
let graph = builder.build(root).await?;
println!(
"Built dependency graph: {} packages, {} edges (in {} ms)",
graph.package_count(),
graph.dependency_count(),
builder.stats().build_duration_ms,
);
let resolver = DependencyResolver::new(registry);
let resolution = resolver.resolve(graph).await?;
println!(
"\nResolution: {} packages, {} SAT variables, {} clauses, solved in {:?}",
resolution.packages.len(),
resolution.variables_count,
resolution.clauses_count,
resolution.resolution_time,
);
for pkg in &resolution.packages {
println!(
" {} {} ({:?}, from {})",
pkg.name, pkg.version, pkg.dependency_type, pkg.resolved_from,
);
}
Ok(())
}
fn parse_set(s: &str) -> VersionSet {
s.parse().expect("valid version-set syntax")
}