fast-down-cli 2.7.8

超级快的下载器命令行界面
use tokio::io::{self, AsyncBufReadExt, AsyncWriteExt, BufReader};

#[inline]
pub async fn confirm(yes: bool, prompt: &str, default: bool) -> io::Result<bool> {
    fn get_text(value: bool) -> u8 {
        match value {
            true => b'Y',
            false => b'N',
        }
    }
    let text = match default {
        true => b"(Y/n) ",
        false => b"(y/N) ",
    };
    let mut stderr = io::stderr();
    stderr.write_all(prompt.as_bytes()).await?;
    stderr.write_all(text).await?;
    if yes {
        stderr.write_all(&[get_text(true), b'\n']).await?;
        return Ok(true);
    }
    stderr.flush().await?;
    loop {
        let mut input = String::with_capacity(4);
        BufReader::new(io::stdin()).read_line(&mut input).await?;
        break match input.trim() {
            "y" | "Y" => Ok(true),
            "n" | "N" => Ok(false),
            "" => Ok(default),
            _ => {
                stderr.write_all(prompt.as_bytes()).await?;
                stderr.write_all(text).await?;
                stderr.flush().await?;
                continue;
            }
        };
    }
}