diff --git a/Cargo.lock b/Cargo.lock index 7410373..4c81380 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -375,12 +375,14 @@ dependencies = [ "clap", "color-eyre", "dialoguer", + "dinopkg-npm-registry", "dinopkg-package-json", "env_logger", "exitcode", "gix-config", "maplit", "owo-colors 4.0.0", + "reqwest", "serde_json", "spdx", "syntect", @@ -400,7 +402,7 @@ dependencies = [ [[package]] name = "dinopkg-package-json" -version = "0.1.0" +version = "0.2.0" dependencies = [ "serde", "serde_json", diff --git a/crates/dinopkg-cli/Cargo.toml b/crates/dinopkg-cli/Cargo.toml index 92c49e1..2a6b7e7 100644 --- a/crates/dinopkg-cli/Cargo.toml +++ b/crates/dinopkg-cli/Cargo.toml @@ -15,6 +15,7 @@ tokio = { version = "1.38.0", features = [ dinopkg-package-json = { path = "../dinopkg-package-json", features = [ "tokio", ] } +dinopkg-npm-registry = { path = "../dinopkg-npm-registry" } exitcode = "1.1.2" env_logger = "0.11.3" dialoguer = "0.11.0" @@ -25,3 +26,4 @@ serde_json = "1.0.120" syntect = "5.2.0" validate_package_name = { path = "../validate_package_name" } spdx = "0.10.6" +reqwest = "0.12.5" diff --git a/crates/dinopkg-cli/src/command.rs b/crates/dinopkg-cli/src/command.rs index c49b61e..d9ee72d 100644 --- a/crates/dinopkg-cli/src/command.rs +++ b/crates/dinopkg-cli/src/command.rs @@ -1,6 +1,7 @@ use clap::{Parser, Subcommand}; pub mod init; +pub mod install; pub mod run; #[derive(Parser)] @@ -26,4 +27,11 @@ pub enum Command { /// Create a package.json file #[command(aliases = ["create", "innit"])] Init, + + /// Installs dependencies for `package.json` + #[command(aliases = ["i", "add"])] + Install { + /// The name of the package to install + name: String, + }, } diff --git a/crates/dinopkg-cli/src/command/init.rs b/crates/dinopkg-cli/src/command/init.rs index af6fdde..6425e2c 100644 --- a/crates/dinopkg-cli/src/command/init.rs +++ b/crates/dinopkg-cli/src/command/init.rs @@ -4,7 +4,7 @@ use camino::Utf8PathBuf; use color_eyre::eyre::eyre; use color_eyre::Result; use dialoguer::{theme::ColorfulTheme, Confirm, Input}; -use dinopkg_package_json::PackageJson; +use dinopkg_package_json::{PackageJson, AuthorObjOrString}; use gix_config::File as GitConfigFile; use maplit::hashmap; use owo_colors::OwoColorize; @@ -96,7 +96,7 @@ pub async fn init() -> Result<()> { let package_json = PackageJson { name: package_name, version, - author: Some(author), + author: Some(AuthorObjOrString::String(author)), repository: Some(git_repository), license: Some(license), description: Some(description), diff --git a/crates/dinopkg-cli/src/command/install.rs b/crates/dinopkg-cli/src/command/install.rs new file mode 100644 index 0000000..bccfdf5 --- /dev/null +++ b/crates/dinopkg-cli/src/command/install.rs @@ -0,0 +1,10 @@ +use color_eyre::Result; +use dinopkg_npm_registry::PackageInfo; + +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); + Ok(()) +} diff --git a/crates/dinopkg-cli/src/main.rs b/crates/dinopkg-cli/src/main.rs index 9e3eb2a..c961f20 100644 --- a/crates/dinopkg-cli/src/main.rs +++ b/crates/dinopkg-cli/src/main.rs @@ -19,6 +19,7 @@ async fn main() -> Result<()> { Command::Run { script_name } => command::run::run(script_name).await?, Command::Test => command::run::run(Some("test".into())).await?, Command::Init => command::init::init().await?, + Command::Install { name } => command::install::install_cmd(name).await?, } Ok(()) } diff --git a/crates/dinopkg-npm-registry/src/lib.rs b/crates/dinopkg-npm-registry/src/lib.rs index 8a666dd..eba827a 100644 --- a/crates/dinopkg-npm-registry/src/lib.rs +++ b/crates/dinopkg-npm-registry/src/lib.rs @@ -1,17 +1,17 @@ use std::collections::HashMap; -use serde::{Serialize, Deserialize}; use dinopkg_package_json::PackageJson; +use serde::{Deserialize, Serialize}; const NPM_REGISTRY_ROOT_URL: &str = "https://registry.npmjs.org"; -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Debug)] pub struct PackageInfo { /// The name of the package, for example `discord.js`. 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, } @@ -23,10 +23,13 @@ pub enum Error { } impl PackageInfo { - pub async fn get_package_info(package_name: &str, client: &reqwest::Client) -> Result { + pub async fn from_name( + package_name: &str, + client: &reqwest::Client, + ) -> Result { let url = format!("{NPM_REGISTRY_ROOT_URL}/{package_name}"); let response = client.get(&url).send().await?; let package_info = response.json::().await?; Ok(package_info) } -} \ No newline at end of file +} diff --git a/crates/dinopkg-package-json/Cargo.toml b/crates/dinopkg-package-json/Cargo.toml index aec604f..60a7024 100644 --- a/crates/dinopkg-package-json/Cargo.toml +++ b/crates/dinopkg-package-json/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dinopkg-package-json" -version = "0.1.0" +version = "0.2.0" edition = "2021" [dependencies] diff --git a/crates/dinopkg-package-json/src/lib.rs b/crates/dinopkg-package-json/src/lib.rs index d48659a..45e4ce4 100644 --- a/crates/dinopkg-package-json/src/lib.rs +++ b/crates/dinopkg-package-json/src/lib.rs @@ -8,12 +8,12 @@ mod util; #[serde_as] #[skip_serializing_none] -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] pub struct PackageJson { pub name: String, pub version: String, - pub author: Option, + pub author: Option, #[serde(default = "default_as_false")] #[serde(skip_serializing_if = "is_false")] pub private: bool, @@ -28,6 +28,13 @@ pub struct PackageJson { pub dev_dependencies: Option, } +#[derive(Serialize, Deserialize, Debug)] +#[serde(untagged)] +pub enum AuthorObjOrString { + Author { name: String, url: Option }, + String(String), +} + // serde :/ #[allow(clippy::trivially_copy_pass_by_ref)] #[inline(always)]