pay-respects/src/modes.rs

136 lines
3 KiB
Rust
Raw Normal View History

2024-12-06 17:35:48 +01:00
use crate::shell::Data;
2024-12-06 23:37:28 +01:00
use crate::suggestions::{best_match_path, suggest_candidates};
use crate::system;
2024-11-23 22:51:43 +01:00
use crate::{shell, suggestions};
2024-11-23 22:18:33 +01:00
use colored::Colorize;
use inquire::*;
2024-11-23 22:18:33 +01:00
2024-12-06 17:35:48 +01:00
pub fn suggestion(data: &mut Data) {
let shell = data.shell.clone();
2024-12-07 00:20:00 +01:00
let mut last_command;
2024-11-23 22:18:33 +01:00
loop {
2024-12-06 21:36:08 +01:00
last_command = data.command.clone();
2024-12-06 23:37:28 +01:00
suggest_candidates(data);
if data.candidates.is_empty() {
break;
2024-11-23 22:18:33 +01:00
};
2024-12-06 23:37:28 +01:00
for candidate in &mut data.candidates {
shell::shell_syntax(&shell, candidate);
}
2024-11-23 22:18:33 +01:00
2024-12-06 23:37:28 +01:00
suggestions::select_candidate(data);
let execution = suggestions::confirm_suggestion(data);
2024-11-23 22:18:33 +01:00
if execution.is_ok() {
return;
} else {
2024-12-06 23:37:28 +01:00
data.update_command(&data.suggest.clone().unwrap());
2024-12-06 19:12:40 +01:00
let msg = Some(
execution
.err()
.unwrap()
.split_whitespace()
.collect::<Vec<&str>>()
.join(" "),
);
2024-12-06 17:35:48 +01:00
data.update_error(msg);
2024-11-23 22:18:33 +01:00
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/")
);
}
2024-12-06 17:35:48 +01:00
pub fn cnf(data: &mut Data) {
let shell = data.shell.clone();
let mut split_command = data.split.clone();
2024-11-23 22:18:33 +01:00
2024-12-06 17:35:48 +01:00
let executable = split_command[0].as_str();
2024-12-07 01:01:04 +01:00
eprintln!(
"{}: {}: {}\n",
shell.red(),
t!("command-not-found"),
executable
);
2024-11-23 22:18:33 +01:00
let best_match = best_match_path(executable);
if best_match.is_some() {
let best_match = best_match.unwrap();
2024-12-06 17:35:48 +01:00
split_command[0] = best_match;
2024-12-06 21:36:08 +01:00
let suggest = split_command.join(" ");
2024-12-06 23:37:28 +01:00
data.candidates.push(suggest.clone());
suggestions::select_candidate(data);
let status = suggestions::confirm_suggestion(data);
2024-12-06 21:36:08 +01:00
if status.is_err() {
data.update_command(&suggest);
let msg = Some(
status
.err()
.unwrap()
.split_whitespace()
.collect::<Vec<&str>>()
.join(" "),
);
data.update_error(msg);
2024-12-07 01:13:09 +01:00
suggestion(data);
2024-12-06 21:36:08 +01:00
}
} else {
let package_manager = match system::get_package_manager(&shell) {
Some(package_manager) => package_manager,
None => {
return;
}
};
2024-12-07 01:01:04 +01:00
let packages = match system::get_packages(&shell, &package_manager, executable)
{
Some(packages) => packages,
None => {
2024-12-07 01:01:04 +01:00
eprintln!(
"{}: {}",
"pay-respects".red(),
t!("package-not-found")
);
return;
}
};
2024-12-07 01:01:04 +01:00
let style = ui::Styled::default();
let render_config = ui::RenderConfig::default()
.with_prompt_prefix(style);
let msg = format!("{}", t!("install-package"))
.bold()
.blue();
let hint = format!(
"{} {} {}",
"[↑/↓]".blue(),
t!("confirm-yes").green(),
"[Ctrl+C]".red()
);
eprintln!("{}", msg);
eprintln!("{}", hint);
let package = Select::new("\n", packages)
2024-12-07 02:13:35 +01:00
.with_vim_mode(true)
2024-12-07 01:01:04 +01:00
.without_help_message()
.with_render_config(render_config)
2024-12-07 01:03:52 +01:00
.without_filtering()
2024-12-07 01:01:04 +01:00
.prompt().unwrap();
// retry after installing package
if system::install_package(&shell, &package_manager, &package) {
2024-12-07 01:10:31 +01:00
let _ = suggestions::run_suggestion(data, &data.command);
2024-11-23 22:18:33 +01:00
}
}
}