From c5dd2c6bbab498656a7a737643a33e27be42c896 Mon Sep 17 00:00:00 2001 From: SkyfallWasTaken Date: Tue, 30 Jul 2024 11:26:24 +0100 Subject: [PATCH] Add install scaffold, `dist-keys` --- crates/dinopkg-cli/src/command/install.rs | 31 ++++++++++++++++++++++- crates/dinopkg-npm-registry/src/lib.rs | 7 +++-- crates/dinopkg-package-json/Cargo.toml | 3 +++ crates/dinopkg-package-json/src/lib.rs | 4 +-- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/crates/dinopkg-cli/src/command/install.rs b/crates/dinopkg-cli/src/command/install.rs index bccfdf5..10d9d75 100644 --- a/crates/dinopkg-cli/src/command/install.rs +++ b/crates/dinopkg-cli/src/command/install.rs @@ -1,10 +1,39 @@ use color_eyre::Result; use dinopkg_npm_registry::PackageInfo; +use owo_colors::OwoColorize; pub async fn install_cmd(name: String) -> Result<()> { let client = reqwest::Client::new(); let package_info = PackageInfo::from_name(&name, &client).await?; - dbg!(package_info); + let latest_version = package_info.dist_keys.get("latest").unwrap(); + let latest_package = package_info.versions.get(latest_version).unwrap(); + print_dep_version(&latest_package.name, &latest_package.version, false); + + if let Some(deps) = &latest_package.dependencies { + for (dep_name, dep_version) in deps { + print_dep_version(dep_name, dep_version, false); + } + } + if let Some(deps) = &latest_package.dev_dependencies { + for (dep_name, dep_version) in deps { + print_dep_version(dep_name, dep_version, true); + } + } + Ok(()) } + +fn print_dep_version(name: &String, version: &String, is_dev: bool) { + println!( + " {} {} {}{}", + "Installing".green().bold(), + name, + version, + if is_dev { + format!("{}", " (dev)".dimmed().bold()) + } else { + "".into() + } + ); +} diff --git a/crates/dinopkg-npm-registry/src/lib.rs b/crates/dinopkg-npm-registry/src/lib.rs index 618875e..b77eab8 100644 --- a/crates/dinopkg-npm-registry/src/lib.rs +++ b/crates/dinopkg-npm-registry/src/lib.rs @@ -8,12 +8,15 @@ const NPM_REGISTRY_ROOT_URL: &str = "https://registry.npmjs.org"; #[derive(Serialize, Deserialize, Debug)] pub struct PackageInfo { /// The name of the package, for example `discord.js`. - name: String, + pub name: String, /// A map of versions to their respective version info. /// /// The key is the version string (e.g. `0.1.0`), and the value is the version's `package.json` info. - versions: HashMap, + pub versions: HashMap, + + #[serde(rename = "dist-tags")] + pub dist_keys: HashMap, } #[derive(thiserror::Error, Debug)] diff --git a/crates/dinopkg-package-json/Cargo.toml b/crates/dinopkg-package-json/Cargo.toml index 57126be..31ee8e8 100644 --- a/crates/dinopkg-package-json/Cargo.toml +++ b/crates/dinopkg-package-json/Cargo.toml @@ -13,3 +13,6 @@ tokio = { version = "1.38.0", features = ["fs"], optional = true } [dev-dependencies] maplit = "1.0.2" pretty_assertions = "1.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(tarpaulin_include)'] } diff --git a/crates/dinopkg-package-json/src/lib.rs b/crates/dinopkg-package-json/src/lib.rs index 8261af8..ab95758 100644 --- a/crates/dinopkg-package-json/src/lib.rs +++ b/crates/dinopkg-package-json/src/lib.rs @@ -44,14 +44,14 @@ pub enum RepositoryVariant { // serde :/ #[allow(clippy::trivially_copy_pass_by_ref)] -#[cfg(not(tarpaullin_include))] +#[cfg(not(tarpaulin_include))] #[inline(always)] fn is_false(value: &bool) -> bool { !value } #[inline(always)] -#[cfg(not(tarpaullin_include))] +#[cfg(not(tarpaulin_include))] const fn default_as_false() -> bool { false }