From e948f87af8a70dde5e981447b07c267674bb6ce4 Mon Sep 17 00:00:00 2001 From: Abraham Toriz Date: Fri, 23 Jul 2021 20:37:21 -0500 Subject: [PATCH] implement t sheet --- src/commands/display.rs | 6 --- src/commands/sheet.rs | 92 +++++++++++++++++++++++++++++++++++++++-- src/database.rs | 3 ++ 3 files changed, 91 insertions(+), 10 deletions(-) diff --git a/src/commands/display.rs b/src/commands/display.rs index 0ca1366..a9d138c 100644 --- a/src/commands/display.rs +++ b/src/commands/display.rs @@ -158,12 +158,6 @@ mod tests { ); } - #[test] - fn correctly_use_utc_if_new_version() { - assert!(false, "start with a newly created database"); - assert!(false, "correctly display times in local timezone"); - } - #[test] fn filter_by_start() { let args = Args { diff --git a/src/commands/sheet.rs b/src/commands/sheet.rs index 15fd283..22c1b3b 100644 --- a/src/commands/sheet.rs +++ b/src/commands/sheet.rs @@ -36,9 +36,35 @@ impl<'a> Command<'a> for SheetCommand { O: Write, E: Write, { - if let Some(_sheet) = args.sheet { + if let Some(sheet) = args.sheet { + let current_sheet = db.current_sheet()?.unwrap_or("default".into()); + // sheet given, switch to it - unimplemented!() + if sheet == "-" { + if let Some(move_to) = db.last_sheet()? { + db.set_last_sheet(¤t_sheet)?; + db.set_current_sheet(&move_to)?; + + writeln!(out, "Switching to sheet '{}'", move_to)?; + + Ok(()) + } else { + writeln!(out, "No previous sheet to move to. Staying on '{}'.\nHint: remember that giving - (a dash) as argument to t sheet switches to the last active sheet", current_sheet)?; + + Ok(()) + } + } else { + if sheet == current_sheet { + writeln!(out, "Already on sheet '{}'", sheet)?; + } else { + db.set_last_sheet(¤t_sheet)?; + db.set_current_sheet(&sheet)?; + + writeln!(out, "Switching to sheet '{}'", sheet)?; + } + + Ok(()) + } } else { // call list ListCommand::handle(Default::default(), db, out, err, config, now) @@ -48,13 +74,71 @@ impl<'a> Command<'a> for SheetCommand { #[cfg(test)] mod tests { + use pretty_assertions::assert_eq; + + use crate::database::SqliteDatabase; + use crate::test_utils::PrettyString; + + use super::*; + #[test] fn switch_to_sheet() { - assert!(false); + let args = Args { + sheet: Some("new_sheet".into()), + }; + let mut db = SqliteDatabase::from_memory().unwrap(); + let mut out = Vec::new(); + let mut err = Vec::new(); + let now = Utc::now(); + + db.init().unwrap(); + + SheetCommand::handle(args, &mut db, &mut out, &mut err, &Default::default(), now).unwrap(); + + assert_eq!(db.current_sheet().unwrap().unwrap(), "new_sheet"); + assert_eq!(PrettyString(&String::from_utf8_lossy(&out)), PrettyString("Switching to sheet 'new_sheet'\n")); + assert_eq!(PrettyString(&String::from_utf8_lossy(&err)), PrettyString("")); } #[test] fn switch_to_sheet_already_in() { - assert!(false); + let args = Args { + sheet: Some("foo".into()), + }; + let mut db = SqliteDatabase::from_memory().unwrap(); + let mut out = Vec::new(); + let mut err = Vec::new(); + let now = Utc::now(); + + db.init().unwrap(); + db.set_current_sheet("foo").unwrap(); + + SheetCommand::handle(args, &mut db, &mut out, &mut err, &Default::default(), now).unwrap(); + + assert_eq!(db.current_sheet().unwrap().unwrap(), "foo"); + assert_eq!(PrettyString(&String::from_utf8_lossy(&out)), PrettyString("Already on sheet 'foo'\n")); + assert_eq!(PrettyString(&String::from_utf8_lossy(&err)), PrettyString("")); + } + + #[test] + fn switch_to_last_sheet() { + let args = Args { + sheet: Some("-".into()), + }; + let mut db = SqliteDatabase::from_memory().unwrap(); + let mut out = Vec::new(); + let mut err = Vec::new(); + let now = Utc::now(); + + db.init().unwrap(); + db.set_current_sheet("foo").unwrap(); + db.set_last_sheet("var").unwrap(); + + SheetCommand::handle(args, &mut db, &mut out, &mut err, &Default::default(), now).unwrap(); + + assert_eq!(db.current_sheet().unwrap().unwrap(), "var"); + assert_eq!(db.last_sheet().unwrap().unwrap(), "foo"); + assert_eq!(PrettyString(&String::from_utf8_lossy(&out)), PrettyString("Switching to sheet 'var'\n")); + assert_eq!(PrettyString(&String::from_utf8_lossy(&err)), PrettyString("")); } } diff --git a/src/database.rs b/src/database.rs index 4b329ab..363a831 100644 --- a/src/database.rs +++ b/src/database.rs @@ -50,6 +50,7 @@ pub trait Database { `value` varchar(255) ) ", &[])?; + self.execute("INSERT INTO meta (key, value) VALUES ('current_sheet', 'default')", &[])?; Ok(()) } @@ -174,12 +175,14 @@ pub trait Database { } fn set_current_sheet(&mut self, sheet: &str) -> Result<()> { + self.execute("DELETE FROM meta WHERE key='current_sheet'", &[])?; self.execute("INSERT INTO meta (key, value) VALUES ('current_sheet', ?1)", &[&sheet])?; Ok(()) } fn set_last_sheet(&mut self, sheet: &str) -> Result<()> { + self.execute("DELETE FROM meta WHERE key='last_sheet'", &[])?; self.execute("INSERT INTO meta (key, value) VALUES ('last_sheet', ?1)", &[&sheet])?; Ok(())