From 73a0b62c7587d4fe36194080034aa9c90f6c649d Mon Sep 17 00:00:00 2001 From: Abraham Toriz Date: Wed, 11 Aug 2021 20:24:42 -0500 Subject: [PATCH] extract ask() into a function and a module --- src/commands/kill.rs | 19 ++++--------------- src/interactive.rs | 14 ++++++++++++++ src/lib.rs | 1 + 3 files changed, 19 insertions(+), 15 deletions(-) create mode 100644 src/interactive.rs diff --git a/src/commands/kill.rs b/src/commands/kill.rs index 0b1c7fa..6956906 100644 --- a/src/commands/kill.rs +++ b/src/commands/kill.rs @@ -1,5 +1,5 @@ use std::convert::TryFrom; -use std::io::{self, Write}; +use std::io::Write; use clap::ArgMatches; use chrono::{DateTime, Utc}; @@ -7,15 +7,10 @@ use chrono::{DateTime, Utc}; use crate::error::{Error, Result}; use crate::database::Database; use crate::config::Config; +use crate::interactive::ask; use super::Command; -fn read_line() -> String { - let mut pre_n = String::new(); - io::stdin().read_line(&mut pre_n).unwrap(); - pre_n -} - #[derive(Debug)] pub enum Args { Id(u64), @@ -48,10 +43,7 @@ impl<'a> Command<'a> for KillCommand { match args { Args::Id(id) => { if let Some(entry) = db.entry_by_id(id)? { - write!(out, "are you sure you want to delete entry {}? ({}) [y/n] ", entry.id, entry.note.unwrap_or_else(|| "".into()))?; - io::stdout().flush()?; - - if read_line().to_lowercase().starts_with('y') { + if ask(out, &format!("are you sure you want to delete entry {}? ({})", entry.id, entry.note.unwrap_or_else(|| "".into())))? { db.delete_entry_by_id(id)?; writeln!(out, "It's dead")?; } else { @@ -64,10 +56,7 @@ impl<'a> Command<'a> for KillCommand { Args::Sheet(sheet) => { let n = db.entries_by_sheet(&sheet, None, None)?.len(); - write!(out, "are you sure you want to delete {} entries on sheet \"{}\"? [y/n] ", n, sheet)?; - io::stdout().flush()?; - - if read_line().to_lowercase().starts_with('y') { + if ask(out, &format!("are you sure you want to delete {} entries on sheet \"{}\"?", n, sheet))? { db.delete_entries_in_sheet(&sheet)?; writeln!(out, "They're gone")?; } else { diff --git a/src/interactive.rs b/src/interactive.rs new file mode 100644 index 0000000..dcdb8bd --- /dev/null +++ b/src/interactive.rs @@ -0,0 +1,14 @@ +use std::io::{self, Write}; + +fn read_line() -> io::Result { + let mut pre_n = String::new(); + io::stdin().read_line(&mut pre_n)?; + Ok(pre_n) +} + +pub fn ask(out: &mut W, question: &str) -> io::Result { + write!(out, "{} [y/N] ", question)?; + out.flush()?; + + Ok(read_line()?.to_lowercase().starts_with('y')) +} diff --git a/src/lib.rs b/src/lib.rs index 131ed0b..11ec9c6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,6 +12,7 @@ pub mod timeparse; pub mod regex; pub mod tabulate; pub mod old; +pub mod interactive; #[cfg(test)] pub mod test_utils;