use crate::animals; use crate::prompt; pub struct CliUser<'a> { db: &'a animals::AnimalDB, } impl<'a> CliUser<'a> { pub fn new(db: &'a animals::AnimalDB) -> Self { CliUser { db } } fn abort(&self) -> ! { println!("Exit."); std::process::exit(1); } } impl<'a> animals::UserAPI for CliUser<'_> { fn notify_new_game(&self) { println!("----- NEW GAME -----"); } fn notify_game_ended(&self) { println!("Game ended.\n"); } fn notify_new_animal(&self, animal: &str) { println!("Learned a new animal: {}", animal); self.db.save("animals.txt").unwrap(); } fn notify_victory(&self) { println!("Yay, found an answer! Thanks for playing."); } fn answer_yes_no(&self, question: &str) -> bool { println!("{}", question); match prompt::ask_yn("> ") { None => self.abort(), Some(b) => b, } } fn is_it_a(&self, animal: &str) -> bool { println!("Is it a {}?", animal); match prompt::ask_yn("> ") { None => self.abort(), Some(b) => b, } } fn what_is_it(&self) -> String { println!("What animal is it?"); match prompt::ask("> ") { None => self.abort(), Some(s) => s, } } fn how_to_tell_apart(&self, secret: &str, other: &str) -> (String, bool) { println!("How to tell apart {} and {}?", secret, other); let q: String = match prompt::ask("> ") { None => self.abort(), Some(s) => s, }; println!("What is the answer for {}?", secret); let b: bool = match prompt::ask_yn("> ") { None => self.abort(), Some(b) => b, }; (q, b) } }