From dbc7b2ed7961594cb79cb36a125f0c7a535a5ab4 Mon Sep 17 00:00:00 2001
From: Guoxiong Li <lgxbslgx@gmail.com>
Date: Sun, 15 Sep 2024 00:25:49 +0800
Subject: [PATCH] Refactor method 'add_cli' to reduce duplicated code

---
 crates/moon/src/cli/deps.rs    | 51 ++++++++++------------------------
 crates/mooncake/src/pkg/add.rs | 33 ++++++----------------
 2 files changed, 23 insertions(+), 61 deletions(-)

diff --git a/crates/moon/src/cli/deps.rs b/crates/moon/src/cli/deps.rs
index 3a8b13c2..238e3d7b 100644
--- a/crates/moon/src/cli/deps.rs
+++ b/crates/moon/src/cli/deps.rs
@@ -85,47 +85,24 @@ pub fn add_cli(cli: UniversalFlags, cmd: AddSubcommand) -> anyhow::Result<i32> {
     let package_path = cmd.package_path;
 
     let parts: Vec<&str> = package_path.splitn(2, '@').collect();
+
+    let author_pkg: Vec<&str> = parts[0].splitn(2, '/').collect();
+    if author_pkg.len() != 2 {
+        bail!("package path must be in the form of <author>/<package_name>[@<version>]");
+    }
+    let username = author_pkg[0];
+    let pkgname = author_pkg[1];
+    let pkg_name = ModuleName {
+        username: username.to_string(),
+        pkgname: pkgname.to_string(),
+    };
+
     if parts.len() == 2 {
         let version: &str = parts[1];
         let version = version.parse()?;
-
-        let parts: Vec<&str> = parts[0].splitn(2, '/').collect();
-        if parts.len() != 2 {
-            bail!("package path must be in the form of <author>/<package_name>[@<version>]");
-        }
-        let username = parts[0];
-        let pkgname = parts[1];
-
-        let registry_config = RegistryConfig::load();
-        let name = ModuleName {
-            username: username.to_string(),
-            pkgname: pkgname.to_string(),
-        };
-        mooncake::pkg::add::add(
-            &source_dir,
-            &target_dir,
-            &name,
-            &version,
-            &registry_config,
-            false,
-        )
+        mooncake::pkg::add::add(&source_dir, &target_dir, &pkg_name, &version, false)
     } else {
-        let parts: Vec<&str> = parts[0].splitn(2, '/').collect();
-        if parts.len() < 2 {
-            bail!("package path must be in the form of <author>/<package_name>[@<version>]");
-        }
-        let username = parts[0];
-        let pkgname = parts[1];
-
-        let registry_config = RegistryConfig::load();
-        mooncake::pkg::add::add_latest(
-            &source_dir,
-            &target_dir,
-            username,
-            pkgname,
-            &registry_config,
-            false,
-        )
+        mooncake::pkg::add::add_latest(&source_dir, &target_dir, &pkg_name, false)
     }
 }
 
diff --git a/crates/mooncake/src/pkg/add.rs b/crates/mooncake/src/pkg/add.rs
index a788d898..fbce0843 100644
--- a/crates/mooncake/src/pkg/add.rs
+++ b/crates/mooncake/src/pkg/add.rs
@@ -17,27 +17,24 @@
 // For inquiries, you can contact us via e-mail at jichuruanjian@idea.edu.cn.
 
 use colored::Colorize;
+use moonutil::common::{read_module_desc_file_in_dir, write_module_json_to_file, MOONBITLANG_CORE};
 use moonutil::dependency::DependencyInfo;
 use moonutil::module::convert_module_to_mod_json;
-use moonutil::mooncakes::{ModuleName, ModuleSource, RegistryConfig};
+use moonutil::mooncakes::{ModuleName, ModuleSource};
 use semver::Version;
 use std::path::Path;
 use std::rc::Rc;
 
-use moonutil::common::{read_module_desc_file_in_dir, write_module_json_to_file, MOONBITLANG_CORE};
-
 use crate::registry::{self, Registry, RegistryList};
 use crate::resolver::resolve_single_root_with_defaults;
 
 pub fn add_latest(
     source_dir: &Path,
     target_dir: &Path,
-    username: &str,
-    pkgname: &str,
-    registry_config: &RegistryConfig,
+    pkg_name: &ModuleName,
     quiet: bool,
 ) -> anyhow::Result<i32> {
-    if format!("{username}/{pkgname}") == MOONBITLANG_CORE {
+    if pkg_name.to_string() == MOONBITLANG_CORE {
         eprintln!(
             "{}: no need to add `{}` as dependency",
             MOONBITLANG_CORE,
@@ -45,31 +42,20 @@ pub fn add_latest(
         );
         std::process::exit(0);
     }
+
     let registry = registry::OnlineRegistry::mooncakes_io();
-    let pkg_name = ModuleName {
-        username: username.to_string(),
-        pkgname: pkgname.to_string(),
-    };
     let latest_version = registry
-        .get_latest_version(&pkg_name)
+        .get_latest_version(pkg_name)
         .ok_or_else(|| {
             anyhow::anyhow!(
-                "could not find the latest version of {}/{}. Please consider running `moon update` to update the index.",
-                username,
-                pkgname
+                "could not find the latest version of {}. Please consider running `moon update` to update the index.",
+                pkg_name.to_string()
             )
         })?
         .version
         .clone()
         .unwrap();
-    add(
-        source_dir,
-        target_dir,
-        &pkg_name,
-        &latest_version,
-        registry_config,
-        quiet,
-    )
+    add(source_dir, target_dir, pkg_name, &latest_version, quiet)
 }
 
 #[test]
@@ -83,7 +69,6 @@ pub fn add(
     _target_dir: &Path,
     pkg_name: &ModuleName,
     version: &Version,
-    _registry_config: &RegistryConfig,
     quiet: bool,
 ) -> anyhow::Result<i32> {
     let mut m = read_module_desc_file_in_dir(source_dir)?;