pay-respects/src/shell.rs

96 lines
2.5 KiB
Rust
Raw Normal View History

use std::{process::exit};
2023-07-30 18:40:18 +02:00
pub const PRIVILEGE_LIST: [&str; 2] = ["sudo", "doas"];
2023-07-30 18:40:18 +02:00
pub fn command_output(shell: &str, command: &str) -> String {
let output = std::process::Command::new(shell)
.arg("-c")
.arg(command)
2023-07-31 01:23:45 +02:00
.output()
.expect("failed to execute process");
2023-07-30 18:40:18 +02:00
String::from_utf8_lossy(&output.stderr)
.to_string()
.split_whitespace()
.collect::<Vec<&str>>()
.join(" ")
2023-07-30 18:40:18 +02:00
.to_lowercase()
}
fn last_command(shell: &str) -> String {
let last_command = std::env::var("_PR_LAST_COMMAND").expect("No _PR_LAST_COMMAND in environment. Did you aliased the command with the correct argument?");
match shell {
"bash" => {
let first_line = last_command.lines().next().unwrap();
let split = first_line.split_whitespace().collect::<Vec<&str>>();
split[1..].join(" ")
}
"zsh" => last_command,
"fish" => last_command,
2023-07-31 15:06:30 +02:00
"nu" => last_command,
_ => {
eprintln!("Unsupported shell: {}", shell);
exit(1);
}
}
}
pub fn last_command_expanded_alias(shell: &str) -> String {
let alias = std::env::var("_PR_ALIAS").expect(
"No _PR_ALIAS in environment. Did you aliased the command with the correct argument?",
);
let last_command = last_command(shell);
if alias.is_empty() {
return last_command;
}
let split_command = last_command.split_whitespace().collect::<Vec<&str>>();
let command;
if PRIVILEGE_LIST.contains(&split_command[0]) {
command = split_command[1];
} else {
command = split_command[0];
}
let mut expanded_command = command.to_string();
match shell {
"bash" => {
for line in alias.lines() {
if line.starts_with(format!("alias {}=", command).as_str()) {
let alias = line.replace(format!("alias {}='", command).as_str(), "");
let alias = alias.trim_end_matches('\'').trim_start_matches('\'');
expanded_command = alias.to_string();
}
}
}
"zsh" => {
for line in alias.lines() {
if line.starts_with(format!("{}=", command).as_str()) {
let alias = line.replace(format!("{}=", command).as_str(), "");
let alias = alias.trim_start_matches('\'').trim_end_matches('\'');
expanded_command = alias.to_string();
}
}
}
"fish" => {
for line in alias.lines() {
if line.starts_with(format!("alias {} ", command).as_str()) {
let alias = line.replace(format!("alias {} ", command).as_str(), "");
let alias = alias.trim_start_matches('\'').trim_end_matches('\'');
expanded_command = alias.to_string();
}
}
}
_ => {
eprintln!("Unsupported shell: {}", shell);
exit(1);
}
};
2023-07-30 18:40:18 +02:00
last_command.replacen(command, &expanded_command, 1)
2023-07-30 18:40:18 +02:00
}