use crate::output::print;
use rpassword::read_password;
pub fn prompt_password(message: &str) -> String {
prompt_password_with_validation(message, |_| Ok(()))
}
pub fn prompt_password_with_validation<F>(message: &str, validator: F) -> String
where
F: Fn(&str) -> Result<(), &str>,
{
loop {
print!("{message}: ");
if let Err(e) = std::io::Write::flush(&mut std::io::stdout()) {
print::warn(&format!("flush failed: {e}"));
}
let password = match read_password() {
Ok(p) => p,
Err(e) => {
print::error(&format!("Failed to read password: {e}. Try again."));
continue;
}
};
match validator(password.trim()) {
Ok(_) => return password.trim().to_string(),
Err(err) => print::status(&format!("Invalid password: {err}")),
}
}
}