diff options
Diffstat (limited to 'src/command/history.rs')
| -rw-r--r-- | src/command/history.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/command/history.rs b/src/command/history.rs new file mode 100644 index 00000000..72f821c5 --- /dev/null +++ b/src/command/history.rs @@ -0,0 +1,63 @@ +use std::env; + +use eyre::Result; +use structopt::StructOpt; + +use crate::local::database::{Database, SqliteDatabase}; +use crate::local::history::History; + +#[derive(StructOpt)] +pub enum HistoryCmd { + #[structopt( + about="begins a new command in the history", + aliases=&["s", "st", "sta", "star"], + )] + Start { command: Vec<String> }, + + #[structopt( + about="finishes a new command in the history (adds time, exit code)", + aliases=&["e", "en"], + )] + End { + id: String, + #[structopt(long, short)] + exit: i64, + }, + + #[structopt( + about="list all items in history", + aliases=&["l", "li", "lis"], + )] + List, +} + +impl HistoryCmd { + pub fn run(&self, db: SqliteDatabase) -> Result<()> { + match self { + HistoryCmd::Start { command: words } => { + let command = words.join(" "); + let cwd = env::current_dir()?.display().to_string(); + + let h = History::new(chrono::Utc::now().timestamp_nanos(), command, cwd, -1, -1); + + // print the ID + // we use this as the key for calling end + println!("{}", h.id); + db.save(h)?; + Ok(()) + } + + HistoryCmd::End { id, exit } => { + let mut h = db.load(id)?; + h.exit = *exit; + h.duration = chrono::Utc::now().timestamp_nanos() - h.timestamp; + + db.update(h)?; + + Ok(()) + } + + HistoryCmd::List => db.list(), + } + } +} |
