Fix panic in ui::confirm on I/O error (#576)

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
Jiahao XU 2022-11-29 16:53:45 +11:00 committed by GitHub
parent d64710d3a6
commit d63e001d6f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,11 +1,24 @@
use std::{
io::{self, BufRead, Write},
io::{self, BufRead, StdinLock, Write},
thread,
};
use binstalk::errors::BinstallError;
use tokio::sync::oneshot;
fn ask_for_confirm(stdin: &mut StdinLock, input: &mut String) -> io::Result<()> {
{
let mut stdout = io::stdout().lock();
write!(&mut stdout, "Do you wish to continue? yes/[no]\n? ")?;
stdout.flush()?;
}
stdin.read_line(input)?;
Ok(())
}
pub async fn confirm() -> Result<(), BinstallError> {
let (tx, rx) = oneshot::channel();
@ -16,15 +29,10 @@ pub async fn confirm() -> Result<(), BinstallError> {
let mut input = String::with_capacity(16);
let res = loop {
{
let mut stdout = io::stdout().lock();
write!(&mut stdout, "Do you wish to continue? yes/[no]\n? ").unwrap();
stdout.flush().unwrap();
if ask_for_confirm(&mut stdin, &mut input).is_err() {
break false;
}
stdin.read_line(&mut input).unwrap();
match input.as_str().trim() {
"yes" | "y" | "YES" | "Y" => break true,
"no" | "n" | "NO" | "N" | "" => break false,