From aca8b408755f9041da9ee083c625de2a8d8c6785 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Thu, 22 Jan 2026 08:32:29 +0800 Subject: Refactor CLI command processing with new architecture --- src/bin/jvn.rs | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 109 insertions(+), 10 deletions(-) (limited to 'src/bin') diff --git a/src/bin/jvn.rs b/src/bin/jvn.rs index cc93fb1..86e3421 100644 --- a/src/bin/jvn.rs +++ b/src/bin/jvn.rs @@ -1,24 +1,123 @@ -use just_enough_vcs_cli::{subcmd::cmds::_processer::jv_cmd_process, utils::env::current_locales}; -use rust_i18n::set_locale; +use just_enough_vcs_cli::subcmd::cmd::JVCommandContext; +use just_enough_vcs_cli::utils::display::md; +use just_enough_vcs_cli::{ + subcmd::{errors::CmdProcessError, processer::jv_cmd_process}, + utils::env::current_locales, +}; +use rust_i18n::{set_locale, t}; -rust_i18n::i18n!("resources/locales/jv", fallback = "en"); +rust_i18n::i18n!("resources/locales/jvn", fallback = "en"); + +macro_rules! special_flag { + ($args:expr, $flag:expr) => {{ + let flag = $flag; + let found = $args.iter().any(|arg| arg == flag); + $args.retain(|arg| arg != flag); + found + }}; +} + +macro_rules! special_argument { + ($args:expr, $flag:expr) => {{ + let flag = $flag; + let mut value: Option = None; + let mut i = 0; + while i < $args.len() { + if $args[i] == flag { + if i + 1 < $args.len() { + value = Some($args[i + 1].clone()); + $args.remove(i + 1); + $args.remove(i); + } else { + value = None; + $args.remove(i); + } + break; + } + i += 1; + } + value + }}; +} #[tokio::main] -async fn main() -> Result<(), Box> { +async fn main() { + // Collect arguments + let mut args: Vec = std::env::args().skip(1).collect(); + // Init i18n - set_locale(¤t_locales()); + let lang = special_argument!(args, "--lang").unwrap_or(current_locales()); + set_locale(&lang); // Init colored #[cfg(windows)] colored::control::set_virtual_terminal(true).unwrap(); - // Collect arguments - let args: Vec = std::env::args().collect(); + let no_error_logs = special_flag!(args, "--no-error-logs"); + let quiet = special_flag!(args, "--quiet") || special_flag!(args, "-q"); + let help = special_flag!(args, "--help") || special_flag!(args, "-h"); + let confirmed = special_flag!(args, "--confirm") || special_flag!(args, "-C"); // Process commands - let render_result = jv_cmd_process(args).await.unwrap_or_default(); + let render_result = match jv_cmd_process(args, JVCommandContext { help, confirmed }).await { + Ok(result) => result, + Err(e) => { + if !no_error_logs { + match e { + CmdProcessError::Prepare(cmd_prepare_error) => { + eprintln!( + "{}", + md(t!("process_error.prepare_error", error = cmd_prepare_error)) + ); + } + CmdProcessError::Execute(cmd_execute_error) => { + eprintln!( + "{}", + md(t!("process_error.execute_error", error = cmd_execute_error)) + ); + } + CmdProcessError::Render(cmd_render_error) => { + eprintln!( + "{}", + md(t!("process_error.render_error", error = cmd_render_error)) + ); + } + CmdProcessError::Error(error) => { + eprintln!("{}", md(t!("process_error.other", error = error))); + } + CmdProcessError::NoNodeFound(node) => { + eprintln!("{}", md(t!("process_error.no_node_found", node = node))); + } + CmdProcessError::NoMatchingCommand => { + eprintln!("{}", md(t!("process_error.no_matching_command"))); + } + CmdProcessError::AmbiguousCommand(nodes) => { + let nodes_list = nodes + .iter() + .enumerate() + .map(|(i, node)| format!("{}. {}", i + 1, node)) + .collect::>() + .join("\n"); + eprintln!( + "{}", + md(t!("process_error.ambiguous_command", nodes = nodes_list)) + ); + } + CmdProcessError::ParseError(help) => { + if help.trim().len() < 1 { + eprintln!("{}", md(t!("process_error.parse_error"))); + } else { + eprintln!("{}", help) + } + } + } + } + std::process::exit(1); + } + }; // Print - print!("{}", render_result); - Ok(()) + if !quiet { + print!("{}", render_result); + } } -- cgit