pub fn determine_log_level(args: &crate::args::Args) -> String {
if args.verbose {
"debug".to_string()
} else if std::env::var("PACSEA_PREFLIGHT_TRACE").ok().as_deref() == Some("1") {
"trace".to_string()
} else {
args.log_level.clone()
}
}
pub fn get_aur_helper() -> Option<&'static str> {
use std::process::{Command, Stdio};
if Command::new("paru")
.args(["--version"])
.stdin(Stdio::null())
.stdout(Stdio::null())
.stderr(Stdio::null())
.output()
.is_ok()
{
return Some("paru");
}
if Command::new("yay")
.args(["--version"])
.stdin(Stdio::null())
.stdout(Stdio::null())
.stderr(Stdio::null())
.output()
.is_ok()
{
return Some("yay");
}
None
}
pub fn parse_package_names(packages: &[String]) -> Vec<String> {
let mut result = Vec::new();
for pkg in packages {
for name in pkg.split(',') {
let trimmed = name.trim();
if !trimmed.is_empty() {
result.push(trimmed.to_string());
}
}
}
result
}
pub fn prompt_user(message: &str) -> bool {
use std::io::{self, Write};
print!("{message} [Y/n]: ");
io::stdout().flush().ok();
let mut input = String::new();
if io::stdin().read_line(&mut input).is_ok() {
let trimmed = input.trim();
!(trimmed.eq_ignore_ascii_case("n") || trimmed.eq_ignore_ascii_case("no"))
} else {
true }
}
pub fn prompt_user_no_default(message: &str) -> bool {
use std::io::{self, Write};
print!("{message} [y/N]: ");
io::stdout().flush().ok();
let mut input = String::new();
if io::stdin().read_line(&mut input).is_ok() {
let trimmed = input.trim();
trimmed.eq_ignore_ascii_case("y") || trimmed.eq_ignore_ascii_case("yes")
} else {
false }
}