diff --git a/core/src/main.rs b/core/src/main.rs index 23dc638..fc6e430 100644 --- a/core/src/main.rs +++ b/core/src/main.rs @@ -55,6 +55,7 @@ fn main() -> Result<(), std::io::Error> { match data.mode { Suggestion => modes::suggestion(&mut data), Echo => modes::echo(&mut data), + NoConfirm => modes::noconfirm(&mut data), Cnf => modes::cnf(&mut data), } diff --git a/core/src/modes.rs b/core/src/modes.rs index 58d5974..6ddea7a 100644 --- a/core/src/modes.rs +++ b/core/src/modes.rs @@ -2,6 +2,7 @@ use crate::shell::Data; use crate::suggestions; use crate::suggestions::suggest_candidates; use crate::system; +use crate::style::highlight_difference; use colored::Colorize; use inquire::*; use pay_respects_utils::evals::best_matches_path; @@ -50,6 +51,43 @@ pub fn echo(data: &mut Data) { println!("{}", data.candidates.join("\n")); } +pub fn noconfirm(data: &mut Data) { + let mut last_command; + + loop { + last_command = data.command.clone(); + suggest_candidates(data); + if data.candidates.is_empty() { + break; + }; + + let candidate = data.candidates[0].clone(); + eprintln!("{}", + highlight_difference(data, &candidate).unwrap() + ); + data.update_suggest(&candidate); + data.candidates.clear(); + + let execution = suggestions::confirm_suggestion(data); + if execution.is_ok() { + return; + } else { + data.update_command(&data.suggest.clone().unwrap()); + let msg = Some(execution.err().unwrap()); + data.update_error(msg); + + 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(data: &mut Data) { let shell = data.shell.clone(); let mut split_command = data.split.clone(); diff --git a/core/src/shell.rs b/core/src/shell.rs index b12d370..f2d2c65 100644 --- a/core/src/shell.rs +++ b/core/src/shell.rs @@ -20,6 +20,7 @@ pub const PRIVILEGE_LIST: [&str; 2] = ["sudo", "doas"]; pub enum Mode { Suggestion, Echo, + NoConfirm, Cnf, } pub struct Init { @@ -391,6 +392,7 @@ pub fn run_mode() -> Mode { Ok(mode) => match mode.as_str() { "suggestion" => Mode::Suggestion, "cnf" => Mode::Cnf, + "noconfirm" => Mode::NoConfirm, "echo" => Mode::Echo, _ => { eprintln!("Invalid mode: {}", mode); diff --git a/module-request-ai/src/main.rs b/module-request-ai/src/main.rs index 4cb6d77..8192f43 100644 --- a/module-request-ai/src/main.rs +++ b/module-request-ai/src/main.rs @@ -24,6 +24,13 @@ extern crate rust_i18n; i18n!("i18n", fallback = "en", minify_key = true); fn main() -> Result<(), std::io::Error> { + let mode = std::env::var("_PR_MODE"); + if let Ok(mode) = mode { + if mode.as_str() == "noconfirm" { + return Ok(()); + } + } + let command = std::env::var("_PR_LAST_COMMAND").expect("_PR_LAST_COMMAND not set"); let error = std::env::var("_PR_ERROR_MSG").expect("_PR_ERROR_MSG not set"); colored::control::set_override(true);