2021-07-30 17:55:19 -05:00
|
|
|
use std::convert::TryFrom;
|
|
|
|
use std::io::{self, Write};
|
|
|
|
|
|
|
|
use clap::ArgMatches;
|
|
|
|
use chrono::{DateTime, Utc};
|
|
|
|
|
|
|
|
use crate::error::{Error, Result};
|
|
|
|
use crate::database::Database;
|
|
|
|
use crate::config::Config;
|
|
|
|
|
|
|
|
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),
|
|
|
|
Sheet(String),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> TryFrom<&'a ArgMatches<'a>> for Args {
|
|
|
|
type Error = Error;
|
|
|
|
|
|
|
|
fn try_from(args: &'a ArgMatches) -> Result<Args> {
|
|
|
|
Ok(args.value_of("id").map(|v| {
|
|
|
|
Args::Id(v.parse().unwrap())
|
|
|
|
}).unwrap_or_else(|| {
|
|
|
|
Args::Sheet(args.value_of("sheet").unwrap().to_owned())
|
|
|
|
}))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub struct KillCommand;
|
|
|
|
|
|
|
|
impl<'a> Command<'a> for KillCommand {
|
|
|
|
type Args = Args;
|
|
|
|
|
|
|
|
fn handle<D, O, E>(args: Args, db: &mut D, out: &mut O, _err: &mut E, _config: &Config, _now: DateTime<Utc>) -> Result<()>
|
|
|
|
where
|
|
|
|
D: Database,
|
|
|
|
O: Write,
|
|
|
|
E: Write,
|
|
|
|
{
|
|
|
|
match args {
|
|
|
|
Args::Id(id) => {
|
|
|
|
if let Some(entry) = db.entry_by_id(id)? {
|
2021-08-02 19:10:34 -05:00
|
|
|
write!(out, "are you sure you want to delete entry {}? ({}) [y/n] ", entry.id, entry.note.unwrap_or_else(|| "".into()))?;
|
2021-07-30 18:01:00 -05:00
|
|
|
io::stdout().flush()?;
|
2021-07-30 17:55:19 -05:00
|
|
|
|
2021-08-02 19:10:34 -05:00
|
|
|
if read_line().to_lowercase().starts_with('y') {
|
2021-07-30 17:55:19 -05:00
|
|
|
db.delete_entry_by_id(id)?;
|
|
|
|
writeln!(out, "It's dead")?;
|
|
|
|
} else {
|
|
|
|
writeln!(out, "Don't worry, it's still there")?;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
writeln!(out, "There's no entry with id {}. Someone found it before we did.", id)?;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
Args::Sheet(sheet) => {
|
|
|
|
let n = db.entries_by_sheet(&sheet, None, None)?.len();
|
|
|
|
|
2021-07-30 18:01:00 -05:00
|
|
|
write!(out, "are you sure you want to delete {} entries on sheet \"{}\"? [y/n] ", n, sheet)?;
|
|
|
|
io::stdout().flush()?;
|
2021-07-30 17:55:19 -05:00
|
|
|
|
2021-08-02 19:10:34 -05:00
|
|
|
if read_line().to_lowercase().starts_with('y') {
|
2021-07-30 17:55:19 -05:00
|
|
|
db.delete_entries_in_sheet(&sheet)?;
|
|
|
|
writeln!(out, "They're gone")?;
|
|
|
|
} else {
|
|
|
|
writeln!(out, "Don't worry, they're still there")?;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|