From f80fbaa8d3d5dc2b9cef1dd52b7fc298f3d4ec37 Mon Sep 17 00:00:00 2001 From: iff Date: Sat, 23 Nov 2024 22:18:33 +0100 Subject: [PATCH] feat: cnf mode --- src/main.rs | 66 +++++--------------------------------- src/modes.rs | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 58 deletions(-) create mode 100644 src/modes.rs diff --git a/src/main.rs b/src/main.rs index 44be14e..c819723 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,8 +14,6 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -use crate::{shell::command_output, style::highlight_difference}; -use colored::Colorize; use sys_locale::get_locale; mod args; @@ -24,6 +22,7 @@ mod rules; mod shell; mod style; mod suggestions; +mod modes; #[cfg(feature = "runtime-rules")] mod replaces; @@ -59,66 +58,17 @@ fn main() { args::handle_args(); - let shell = match std::env::var("_PR_SHELL") { - Ok(shell) => shell, + let mode = match std::env::var("_PR_MODE") { + Ok(mode) => mode, Err(_) => { - eprintln!( - "{}", - t!("no-env-setup", var = "_PR_SHELL", help = "pay-respects -h") - ); - std::process::exit(1); + "suggestion".to_string() } }; - let mut last_command = shell::last_command(&shell).trim().to_string(); - last_command = shell::expand_alias(&shell, &last_command); - let mut error_msg = command_output(&shell, &last_command); - error_msg = error_msg - .split_whitespace() - .collect::>() - .join(" "); - - loop { - let suggestion = { - let command = suggestions::suggest_command(&shell, &last_command, &error_msg); - if command.is_none() { - break; - }; - - let mut command = command.unwrap(); - shell::shell_syntax(&shell, &mut command); - command - }; - - let highlighted_suggestion = { - let difference = highlight_difference(&shell, &suggestion, &last_command); - if difference.is_none() { - break; - }; - difference.unwrap() - }; - - let execution = - suggestions::confirm_suggestion(&shell, &suggestion, &highlighted_suggestion); - if execution.is_ok() { - return; - } else { - last_command = suggestion; - error_msg = execution.err().unwrap(); - error_msg = error_msg - .split_whitespace() - .collect::>() - .join(" "); - - let retry_message = format!("{}...", t!("retry")); - - eprintln!("\n{}\n", retry_message.cyan().bold()); + match mode.as_str() { + "suggestion" => modes::suggestion(), + "cnf" => modes::cnf(), + _ => { } } - eprintln!("{}: {}\n", t!("no-suggestion"), last_command.red()); - eprintln!( - "{}\n{}", - t!("contribute"), - option_env!("CARGO_PKG_REPOSITORY").unwrap_or("https://github.com/iffse/pay-respects/") - ); } diff --git a/src/modes.rs b/src/modes.rs new file mode 100644 index 0000000..6a9bd38 --- /dev/null +++ b/src/modes.rs @@ -0,0 +1,90 @@ +use crate::shell::{command_output, get_shell, PRIVILEGE_LIST}; +use crate::style::highlight_difference; +use crate::{shell, suggestions}; +use crate::suggestions::{split_command, suggest_typo}; +use colored::Colorize; + +pub fn suggestion() { + let shell = get_shell(); + let mut last_command = shell::last_command(&shell).trim().to_string(); + last_command = shell::expand_alias(&shell, &last_command); + let mut error_msg = command_output(&shell, &last_command); + error_msg = error_msg + .split_whitespace() + .collect::>() + .join(" "); + + loop { + let suggestion = { + let command = suggestions::suggest_command(&shell, &last_command, &error_msg); + if command.is_none() { + break; + }; + + let mut command = command.unwrap(); + shell::shell_syntax(&shell, &mut command); + command + }; + + let highlighted_suggestion = { + let difference = highlight_difference(&shell, &suggestion, &last_command); + if difference.is_none() { + break; + }; + difference.unwrap() + }; + + let execution = + suggestions::confirm_suggestion(&shell, &suggestion, &highlighted_suggestion); + if execution.is_ok() { + return; + } else { + last_command = suggestion; + error_msg = execution.err().unwrap(); + error_msg = error_msg + .split_whitespace() + .collect::>() + .join(" "); + + let retry_message = format!("{}...", t!("retry")); + + eprintln!("\n{}\n", retry_message.cyan().bold()); + } + } + eprintln!("{}: {}\n", t!("no-suggestion"), last_command.red()); + eprintln!( + "{}\n{}", + t!("contribute"), + option_env!("CARGO_PKG_REPOSITORY").unwrap_or("https://github.com/iffse/pay-respects/") + ); +} + +pub fn cnf() { + let shell = get_shell(); + let mut last_command = shell::last_command(&shell).trim().to_string(); + last_command = shell::expand_alias(&shell, &last_command); + + let mut split_command = split_command(&last_command); + let executable = match PRIVILEGE_LIST.contains(&split_command[0].as_str()) { + true => split_command.get(1).expect(&t!("no-command")).as_str(), + false => split_command.first().expect(&t!("no-command")).as_str(), + }; + + let best_match = suggest_typo(&[executable.to_owned()], vec!["path".to_string()]); + if best_match == executable { + eprintln!("{}: no command found", shell); + return + } + match PRIVILEGE_LIST.contains(&split_command[0].as_str()) { + true => { + split_command[1] = best_match; + } + false => { + split_command[0] = best_match; + } + } + let suggestion = split_command.join(" "); + + let highlighted_suggestion = highlight_difference(&shell, &suggestion, &last_command).unwrap(); + let _ = suggestions::confirm_suggestion(&shell, &suggestion, &highlighted_suggestion); +}