use std::io::Write;
use anyhow::Result;
pub(crate) enum SaveMode {
Prompt,
Save,
NoSave,
}
pub(crate) fn is_affirmative(answer: &str) -> bool {
let a = answer.trim();
a.is_empty() || a.eq_ignore_ascii_case("y") || a.eq_ignore_ascii_case("yes")
}
pub(crate) fn should_save(save: &SaveMode, ws_id: &str) -> Result<bool> {
match save {
SaveMode::Save => Ok(true),
SaveMode::NoSave => Ok(false),
SaveMode::Prompt => {
eprint!("Save under workon/{ws_id}? [Y/n] ");
std::io::stderr().flush()?;
let mut answer = String::new();
std::io::stdin().read_line(&mut answer)?;
Ok(is_affirmative(&answer))
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn is_affirmative_defaults_to_yes() {
assert!(is_affirmative(""));
assert!(is_affirmative("\n"));
assert!(is_affirmative("y"));
assert!(is_affirmative("Y\n"));
assert!(is_affirmative("yes"));
}
#[test]
fn is_affirmative_explicit_no_declines() {
assert!(!is_affirmative("n"));
assert!(!is_affirmative("N\n"));
assert!(!is_affirmative("no"));
assert!(!is_affirmative("nope"));
}
#[test]
fn non_interactive_modes_never_read_stdin() {
assert!(should_save(&SaveMode::Save, "ws-1").unwrap());
assert!(!should_save(&SaveMode::NoSave, "ws-1").unwrap());
}
}