diff --git a/src/cmd/install.rs b/src/cmd/install.rs index 14a7cfc..458eacb 100644 --- a/src/cmd/install.rs +++ b/src/cmd/install.rs @@ -208,22 +208,8 @@ pub fn cmd_install(matches: &ArgMatches, session: &Session) -> Result<()> { let mut stdout = std::io::stdout(); let _ = stdout.execute(cursor::Show); - loop { - print!("\nDo you want to continue? [y/N]: "); - std::io::stdout().flush().unwrap(); - let mut input = String::new(); - std::io::stdin().read_line(&mut input).unwrap(); - // - if input.chars().count() == 3 { - let ch: char = input.chars().next().unwrap(); - if ['y', 'Y', 'n', 'N'].contains(&ch) { - let ret = ch == 'y' || ch == 'Y'; - let _ = tx.send(Event::PromptTransactionNeedConfirmResult(ret)); - break; - } - } - } - + let answer = cui::prompt_yes_no(); + let _ = tx.send(Event::PromptTransactionNeedConfirmResult(answer)); let _ = stdout.execute(cursor::Hide); } Event::PackageSyncDone => break, diff --git a/src/cmd/uninstall.rs b/src/cmd/uninstall.rs index e1a8f4d..2dd8dc0 100644 --- a/src/cmd/uninstall.rs +++ b/src/cmd/uninstall.rs @@ -1,9 +1,8 @@ use clap::ArgMatches; use crossterm::style::Stylize; use libscoop::{operation, Event, Session, SyncOption}; -use std::io::Write; -use crate::Result; +use crate::{cui, Result}; pub fn cmd_uninstall(matches: &ArgMatches, session: &Session) -> Result<()> { let queries = matches @@ -57,21 +56,8 @@ pub fn cmd_uninstall(matches: &ArgMatches, session: &Session) -> Result<()> { println!(" {}", output); } - loop { - print!("\nDo you want to continue? [y/N]: "); - std::io::stdout().flush().unwrap(); - let mut input = String::new(); - std::io::stdin().read_line(&mut input).unwrap(); - // - if input.chars().count() == 3 { - let ch: char = input.chars().next().unwrap(); - if ['y', 'Y', 'n', 'N'].contains(&ch) { - let ret = ch == 'y' || ch == 'Y'; - let _ = tx.send(Event::PromptTransactionNeedConfirmResult(ret)); - break; - } - } - } + let answer = cui::prompt_yes_no(); + let _ = tx.send(Event::PromptTransactionNeedConfirmResult(answer)); } Event::PackageCommitStart(ctx) => { println!("Uninstalling {}...", ctx); diff --git a/src/cmd/upgrade.rs b/src/cmd/upgrade.rs index 5e77c0f..e360e54 100644 --- a/src/cmd/upgrade.rs +++ b/src/cmd/upgrade.rs @@ -6,7 +6,6 @@ use crossterm::{ ExecutableCommand, }; use libscoop::{operation, Event, Session, SyncOption}; -use std::io::Write; use crate::{cui, util, Result}; @@ -159,22 +158,8 @@ pub fn cmd_upgrade(matches: &ArgMatches, session: &Session) -> Result<()> { let mut stdout = std::io::stdout(); let _ = stdout.execute(cursor::Show); - loop { - print!("\nDo you want to continue? [y/N]: "); - std::io::stdout().flush().unwrap(); - let mut input = String::new(); - std::io::stdin().read_line(&mut input).unwrap(); - // - if input.chars().count() == 3 { - let ch: char = input.chars().next().unwrap(); - if ['y', 'Y', 'n', 'N'].contains(&ch) { - let ret = ch == 'y' || ch == 'Y'; - let _ = tx.send(Event::PromptTransactionNeedConfirmResult(ret)); - break; - } - } - } - + let answer = cui::prompt_yes_no(); + let _ = tx.send(Event::PromptTransactionNeedConfirmResult(answer)); let _ = stdout.execute(cursor::Hide); } Event::PackageSyncDone => break, diff --git a/src/cui.rs b/src/cui.rs index 55e1f01..ad0f92a 100644 --- a/src/cui.rs +++ b/src/cui.rs @@ -5,7 +5,10 @@ use crossterm::{ ExecutableCommand, }; use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; -use std::{collections::HashMap, io::stdout}; +use std::{ + collections::HashMap, + io::{stdout, Write}, +}; static BAR_FMT: &str = " {wide_msg} {total_bytes:>12} [{bar:>20}] {percent:>3}%"; @@ -147,3 +150,20 @@ impl BucketUpdateUI { .unwrap(); } } + +/// Prompt user to continue or not. +pub fn prompt_yes_no() -> bool { + loop { + print!("\nDo you want to continue? [y/N]: "); + std::io::stdout().flush().unwrap(); + let mut input = String::new(); + std::io::stdin().read_line(&mut input).unwrap(); + let c = input.trim_end(); + if c.chars().count() == 1 { + let ch: char = c.chars().next().unwrap(); + if ['y', 'Y', 'n', 'N'].contains(&ch) { + return ch == 'y' || ch == 'Y'; + } + } + } +}