use std::io::Write as _;
use super::{Answer, Channel, Choice, Question, Report, Weight};
#[derive(Debug, Default, Clone, Copy)]
pub struct Terminal;
impl Channel for Terminal {
fn report(&self, report: &Report) {
let mut err = std::io::stderr().lock();
let _ = writeln!(err, "{}", report.summary);
for line in &report.detail {
let _ = writeln!(err, " {line}");
}
if report.weight == Weight::Interrupt {
let _ = err.flush();
}
}
fn ask(&self, question: &Question) {
let mut err = std::io::stderr().lock();
let _ = writeln!(err, "{}", question.summary);
for line in &question.detail {
let _ = writeln!(err, " {line}");
}
for choice in &question.choices {
if let Some(flag) = flag_for(*choice) {
let _ = writeln!(
err,
" slipcase-open recover {} {flag}",
question.about.as_str()
);
}
}
let _ = err.flush();
}
fn withdraw(&self, _about: &str) {
}
fn answers(&self) -> Vec<Answer> {
Vec::new()
}
}
fn flag_for(choice: Choice) -> Option<&'static str> {
match choice {
Choice::WriteBack => Some("--write-back"),
Choice::Discard => Some("--discard"),
Choice::Reveal => None,
}
}
#[cfg(test)]
mod tests {
use super::{flag_for, Terminal};
use crate::present::{Answer, Channel, Choice};
#[test]
fn every_choice_is_either_a_verb_or_deliberately_not_one() {
assert_eq!(flag_for(Choice::WriteBack), Some("--write-back"));
assert_eq!(flag_for(Choice::Discard), Some("--discard"));
assert_eq!(flag_for(Choice::Reveal), None);
}
#[test]
fn a_terminal_never_answers() {
assert_eq!(Terminal.answers(), Vec::<Answer>::new());
}
}