From 89913eb174eca2b27fcc32d0590f9e0c4d225510 Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Sat, 14 May 2022 16:25:12 +0200 Subject: [PATCH] do semver magic --- src/main.rs | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3b8ad4c..44c6c1a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,11 @@ use std::fs; -use color_eyre::{eyre::WrapErr, Result}; -use tracing::{debug, info, metadata::LevelFilter}; +use color_eyre::{ + eyre::{bail, WrapErr}, + Result, +}; +use semver_rs::{Range, Version}; +use tracing::{debug, info, metadata::LevelFilter, warn}; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, Registry}; use crate::{download::NpmClient, manifest::PackageJson}; @@ -22,19 +26,36 @@ fn main() -> Result<()> { let client = NpmClient::new(); - for (name, _) in &manifest.dependencies.unwrap() { - look_at_package(name, &client)?; + for (name, requested_version) in &manifest.dependencies.unwrap() { + look_at_package(name, requested_version, &client).wrap_err(format!("package {name}"))?; } Ok(()) } #[tracing::instrument(skip(client))] -fn look_at_package(name: &str, client: &NpmClient) -> Result<()> { +fn look_at_package(name: &str, requested_version: &str, client: &NpmClient) -> Result<()> { + let requested = Range::new(requested_version).parse()?; + let meta = client.inspect_package(name)?; - for version in meta.versions.keys() { - info!(%version); + info!(versions = ?meta.versions.keys()); + + let mut versions = meta + .versions + .keys() + .map(|v| Ok((v, Version::new(v).parse()?))) + .collect::, semver_rs::Error>>()?; + + versions.sort_by(|a, b| b.cmp(a)); + + let chosen = versions.iter().find(|(_, version)| requested.test(version)); + + match chosen { + Some((version, _)) => { + info!(?version, "Found version") + } + None => bail!("could not find matching version for '{requested_version}'"), } Ok(())