diff options
Diffstat (limited to 'src/bin')
| -rw-r--r-- | src/bin/jvn.rs | 172 |
1 files changed, 152 insertions, 20 deletions
diff --git a/src/bin/jvn.rs b/src/bin/jvn.rs index 25bf219..fda0c26 100644 --- a/src/bin/jvn.rs +++ b/src/bin/jvn.rs @@ -1,5 +1,10 @@ +use std::process::exit; + +use just_enough_vcs_cli::systems::cmd::_registry::jv_cmd_nodes; use just_enough_vcs_cli::systems::cmd::cmd_system::JVCommandContext; +use just_enough_vcs_cli::systems::cmd::errors::{CmdExecuteError, CmdPrepareError, CmdRenderError}; use just_enough_vcs_cli::utils::display::md; +use just_enough_vcs_cli::utils::levenshtein_distance::levenshtein_distance; use just_enough_vcs_cli::{ systems::cmd::{errors::CmdProcessError, processer::jv_cmd_process}, utils::env::current_locales, @@ -46,23 +51,35 @@ async fn main() { let mut args: Vec<String> = std::env::args().skip(1).collect(); // Init i18n - let lang = special_argument!(args, "--lang").unwrap_or(current_locales()); + let lang = special_argument!(args, "--lang") + .or_else(|| special_argument!(args, "-L")) + .unwrap_or(current_locales()); set_locale(&lang); - // Init colored - #[cfg(windows)] - colored::control::set_virtual_terminal(true).unwrap(); - - let renderer_override = special_argument!(args, "--renderer").unwrap_or("default".to_string()); + // Renderer + let renderer_override = special_argument!(args, "--renderer") + .or_else(|| special_argument!(args, "-R")) + .unwrap_or("default".to_string()); + // Other flags 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"); + // Init colored + #[cfg(windows)] + colored::control::set_virtual_terminal(true).unwrap(); + + // Handle help when no arguments provided + if args.len() < 1 && help { + eprintln!("{}", md(t!("help"))); + exit(1); + } + // Process commands let render_result = match jv_cmd_process( - args, + &args, JVCommandContext { help, confirmed }, renderer_override, ) @@ -73,22 +90,13 @@ async fn main() { if !no_error_logs { match e { CmdProcessError::Prepare(cmd_prepare_error) => { - eprintln!( - "{}", - md(t!("process_error.prepare_error", error = cmd_prepare_error)) - ); + handle_prepare_error(cmd_prepare_error); } CmdProcessError::Execute(cmd_execute_error) => { - eprintln!( - "{}", - md(t!("process_error.execute_error", error = cmd_execute_error)) - ); + handle_execute_error(cmd_execute_error); } CmdProcessError::Render(cmd_render_error) => { - eprintln!( - "{}", - md(t!("process_error.render_error", error = cmd_render_error)) - ); + handle_render_error(cmd_render_error); } CmdProcessError::Error(error) => { eprintln!("{}", md(t!("process_error.other", error = error))); @@ -97,7 +105,7 @@ async fn main() { eprintln!("{}", md(t!("process_error.no_node_found", node = node))); } CmdProcessError::NoMatchingCommand => { - eprintln!("{}", md(t!("process_error.no_matching_command"))); + handle_no_matching_command_error(args); } CmdProcessError::AmbiguousCommand(nodes) => { let nodes_list = nodes @@ -129,3 +137,127 @@ async fn main() { print!("{}", render_result); } } + +fn handle_no_matching_command_error(args: Vec<String>) { + let mut similar_nodes: Vec<String> = Vec::new(); + for node in jv_cmd_nodes() { + let node_len = node.split(" ").collect::<Vec<&str>>().iter().len(); + let args_len = args.len(); + if args_len < node_len { + continue; + } + let args_str = args[..node_len].join(" "); + let distance = levenshtein_distance(args_str.as_str(), node.as_str()); + if distance <= 2 { + similar_nodes.push(node); + } + } + if similar_nodes.len() < 1 { + eprintln!("{}", md(t!("process_error.no_matching_command"))); + } else { + eprintln!( + "{}", + md(t!( + "process_error.no_matching_command_but_similar", + similars = similar_nodes[0] + )) + ); + } +} + +fn handle_prepare_error(cmd_prepare_error: CmdPrepareError) { + match cmd_prepare_error { + CmdPrepareError::Io(error) => { + eprintln!("{}", md(t!("prepare_error.io", error = error.to_string()))); + } + CmdPrepareError::Error(msg) => { + eprintln!("{}", md(t!("prepare_error.error", error = msg))); + } + CmdPrepareError::LocalWorkspaceNotFound => { + eprintln!("{}", md(t!("prepare_error.local_workspace_not_found"))); + } + CmdPrepareError::LocalConfigNotFound => { + eprintln!("{}", md(t!("prepare_error.local_config_not_found"))); + } + CmdPrepareError::LatestInfoNotFound => { + eprintln!("{}", md(t!("prepare_error.latest_info_not_found"))); + } + CmdPrepareError::LatestFileDataNotExist(member_id) => { + eprintln!( + "{}", + md(t!( + "prepare_error.latest_file_data_not_exist", + member_id = member_id + )) + ); + } + CmdPrepareError::CachedSheetNotFound(sheet_name) => { + eprintln!( + "{}", + md(t!( + "prepare_error.cached_sheet_not_found", + sheet_name = sheet_name + )) + ); + } + CmdPrepareError::LocalSheetNotFound(member_id, sheet_name) => { + eprintln!( + "{}", + md(t!( + "prepare_error.local_sheet_not_found", + member_id = member_id, + sheet_name = sheet_name + )) + ); + } + CmdPrepareError::LocalStatusAnalyzeFailed => { + eprintln!("{}", md(t!("prepare_error.local_status_analyze_failed"))); + } + CmdPrepareError::NoSheetInUse => { + eprintln!("{}", md(t!("prepare_error.no_sheet_in_use"))); + } + } +} + +fn handle_execute_error(cmd_execute_error: CmdExecuteError) { + match cmd_execute_error { + CmdExecuteError::Io(error) => { + eprintln!("{}", md(t!("execute_error.io", error = error.to_string()))); + } + CmdExecuteError::Prepare(cmd_prepare_error) => handle_prepare_error(cmd_prepare_error), + CmdExecuteError::Error(msg) => { + eprintln!("{}", md(t!("execute_error.error", error = msg))); + } + } +} + +fn handle_render_error(cmd_render_error: CmdRenderError) { + match cmd_render_error { + CmdRenderError::Io(error) => { + eprintln!("{}", md(t!("render_error.io", error = error.to_string()))); + } + CmdRenderError::Prepare(cmd_prepare_error) => handle_prepare_error(cmd_prepare_error), + CmdRenderError::Execute(cmd_execute_error) => handle_execute_error(cmd_execute_error), + CmdRenderError::Error(msg) => { + eprintln!("{}", md(t!("render_error.error", error = msg))); + } + CmdRenderError::SerializeFailed(error) => { + eprintln!( + "{}", + md(t!( + "render_error.serialize_failed", + error = error.to_string() + )) + ); + } + CmdRenderError::RendererNotFound(renderer_name) => { + eprintln!( + "{}", + md(t!( + "render_error.renderer_not_found", + renderer_name = renderer_name + )) + ); + } + } +} |
