evobench_tools/utillib/
ask.rs

1use std::io::Write;
2use std::{
3    fs::OpenOptions,
4    io::{BufRead, BufReader},
5};
6
7use anyhow::{Result, bail};
8
9pub fn ask_yn(question: &str) -> Result<bool> {
10    let mut opts = OpenOptions::new();
11    opts.read(true).write(true).create(false);
12    let opn = || opts.open("/dev/tty");
13    let mut inp = BufReader::new(opn()?);
14    let mut outp = opn()?;
15    for n in (1..5).rev() {
16        write!(outp, "{} (y/n) ", question)?;
17        let mut ans = String::new();
18        inp.read_line(&mut ans)?;
19        if ans.len() > 1 && ans.starts_with("y") {
20            return Ok(true);
21        } else if ans.len() > 1 && ans.starts_with("n") {
22            return Ok(false);
23        }
24        writeln!(outp, "Please answer with y or n, {} tries left", n)?;
25    }
26    bail!("Could not get an answer to the question {:?}", question)
27}