diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-01-22 08:32:29 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-01-22 08:32:29 +0800 |
| commit | aca8b408755f9041da9ee083c625de2a8d8c6785 (patch) | |
| tree | 5747d389d5218ccf39e2153ae1346f7b5bfe8fb8 /src/bin | |
| parent | 0d614f3e2104e9b840ebc7e53a6caa6af1671636 (diff) | |
Refactor CLI command processing with new architecture
Diffstat (limited to 'src/bin')
| -rw-r--r-- | src/bin/jvn.rs | 119 |
1 files changed, 109 insertions, 10 deletions
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<String> = 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<dyn std::error::Error>> { +async fn main() { + // Collect arguments + let mut args: Vec<String> = 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<String> = 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::<Vec<String>>() + .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); + } } |
