From 58078e6c0bcf36f14c97007beb2aabe8dc0810d1 Mon Sep 17 00:00:00 2001 From: Ramana Venkata Date: Tue, 18 Jul 2023 09:32:52 +0530 Subject: [PATCH] feat: implement -D, -O options for add command --- crates/cli/src/commands.rs | 19 +++++++++++++++++++ crates/cli/src/lib.rs | 2 +- crates/package_json/src/lib.rs | 29 ++++++++++++++++++++++++++--- crates/registry/src/lib.rs | 6 +++--- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/crates/cli/src/commands.rs b/crates/cli/src/commands.rs index 93ddd91e8..d98d56608 100644 --- a/crates/cli/src/commands.rs +++ b/crates/cli/src/commands.rs @@ -1,4 +1,5 @@ use clap::{Parser, Subcommand}; +use pacquet_package_json::DependencyType; /// Experimental package manager for node.js written in rust. #[derive(Parser, Debug)] @@ -23,8 +24,26 @@ pub enum Subcommands { pub struct AddArgs { /// Name of the package pub package: String, + /// Add the package as a dev dependency + #[arg(short = 'D', group = "dependency_type")] + dev: bool, + /// Add the package as a optional dependency + #[arg(short = 'O', group = "dependency_type")] + optional: bool, /// The directory with links to the store (default is node_modules/.pacquet). /// All direct and indirect dependencies of the project are linked into this directory #[arg(long = "virtual-store-dir", default_value = "node_modules/.pacquet")] pub virtual_store_dir: String, } + +impl AddArgs { + pub fn get_dependency_type(&self) -> DependencyType { + if self.dev { + DependencyType::Dev + } else if self.optional { + DependencyType::Optional + } else { + DependencyType::Normal + } + } +} diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index 955178e46..0d6550a61 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -30,7 +30,7 @@ pub async fn run_commands() -> Result<()> { package_json_path, )?; registry_manager.prepare()?; - registry_manager.add_dependency(&args.package).await?; + registry_manager.add_dependency(&args.package, args.get_dependency_type()).await?; } } diff --git a/crates/package_json/src/lib.rs b/crates/package_json/src/lib.rs index 79ca4719b..c63279563 100644 --- a/crates/package_json/src/lib.rs +++ b/crates/package_json/src/lib.rs @@ -1,6 +1,7 @@ pub mod error; use std::{ + convert::Into, ffi::OsStr, fs, io::{Read, Write}, @@ -16,6 +17,22 @@ pub struct PackageJson { value: Value, } +pub enum DependencyType { + Normal, + Dev, + Optional, +} + +impl Into<&str> for DependencyType { + fn into(self) -> &'static str { + match self { + DependencyType::Normal => "dependencies", + DependencyType::Dev => "devDependencies", + DependencyType::Optional => "optionalDependencies", + } + } +} + impl PackageJson { pub fn new(path: PathBuf, value: Value) -> PackageJson { PackageJson { path, value } @@ -73,8 +90,14 @@ impl PackageJson { Ok(()) } - pub fn add_dependency(&mut self, name: &str, version: &str) -> Result<(), PackageJsonError> { - if let Some(field) = self.value.get_mut("dependencies") { + pub fn add_dependency( + &mut self, + name: &str, + version: &str, + dependency_type: DependencyType, + ) -> Result<(), PackageJsonError> { + let dependency_type: &str = dependency_type.into(); + if let Some(field) = self.value.get_mut(dependency_type) { if let Some(dependencies) = field.as_object_mut() { dependencies.insert(name.to_string(), Value::String(version.to_string())); } else { @@ -85,7 +108,7 @@ impl PackageJson { } else { let mut dependencies = Map::::new(); dependencies.insert(name.to_string(), Value::String(version.to_string())); - self.value["dependencies"] = Value::Object(dependencies); + self.value[dependency_type] = Value::Object(dependencies); } Ok(()) } diff --git a/crates/registry/src/lib.rs b/crates/registry/src/lib.rs index 135804530..3b172dcbb 100644 --- a/crates/registry/src/lib.rs +++ b/crates/registry/src/lib.rs @@ -10,7 +10,7 @@ use std::{ use async_recursion::async_recursion; use futures_util::future::join_all; -use pacquet_package_json::PackageJson; +use pacquet_package_json::{DependencyType, PackageJson}; use pacquet_tarball::{download_dependency, get_package_store_folder_name}; use crate::{error::RegistryError, http_client::HttpClient}; @@ -42,7 +42,7 @@ impl RegistryManager { Ok(()) } - pub async fn add_dependency(&mut self, name: &str) -> Result<(), RegistryError> { + pub async fn add_dependency(&mut self, name: &str, dependency_type: DependencyType) -> Result<(), RegistryError> { let latest_version = self.client.get_package_by_version(name, "latest").await?; let dependency_store_folder_name = get_package_store_folder_name(name, &latest_version.version.to_string()); @@ -80,7 +80,7 @@ impl RegistryManager { ) .await; - self.package_json.add_dependency(name, &format!("^{0}", &latest_version.version))?; + self.package_json.add_dependency(name, &format!("^{0}", &latest_version.version), dependency_type)?; self.package_json.save()?; Ok(())