Skip to content

Commit

Permalink
feat: implement -D, -O options for add command
Browse files Browse the repository at this point in the history
  • Loading branch information
vramana committed Jul 18, 2023
1 parent 606e998 commit 58078e6
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 7 deletions.
19 changes: 19 additions & 0 deletions crates/cli/src/commands.rs
Original file line number Diff line number Diff line change
@@ -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)]
Expand All @@ -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
}
}
}
2 changes: 1 addition & 1 deletion crates/cli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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?;
}
}

Expand Down
29 changes: 26 additions & 3 deletions crates/package_json/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
pub mod error;

use std::{
convert::Into,
ffi::OsStr,
fs,
io::{Read, Write},
Expand All @@ -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 }
Expand Down Expand Up @@ -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 {
Expand All @@ -85,7 +108,7 @@ impl PackageJson {
} else {
let mut dependencies = Map::<String, Value>::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(())
}
Expand Down
6 changes: 3 additions & 3 deletions crates/registry/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -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(())
Expand Down

0 comments on commit 58078e6

Please sign in to comment.