From a21737e2b7f8d1e426726bdd7536033f299d476a Mon Sep 17 00:00:00 2001 From: Ellie Huxtable Date: Tue, 20 Apr 2021 21:53:07 +0100 Subject: Use cargo workspaces (#37) * Switch to Cargo workspaces Breaking things into "client", "server" and "common" makes managing the codebase much easier! client - anything running on a user's machine for adding history server - handles storing/syncing history and running a HTTP server common - request/response API definitions, common utils, etc * Update dockerfile --- atuin-client/src/history.rs | 66 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 atuin-client/src/history.rs (limited to 'atuin-client/src/history.rs') diff --git a/atuin-client/src/history.rs b/atuin-client/src/history.rs new file mode 100644 index 00000000..7f607784 --- /dev/null +++ b/atuin-client/src/history.rs @@ -0,0 +1,66 @@ +use std::env; +use std::hash::{Hash, Hasher}; + +use chrono::Utc; + +use atuin_common::utils::uuid_v4; + +// Any new fields MUST be Optional<>! +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct History { + pub id: String, + pub timestamp: chrono::DateTime, + pub duration: i64, + pub exit: i64, + pub command: String, + pub cwd: String, + pub session: String, + pub hostname: String, +} + +impl History { + pub fn new( + timestamp: chrono::DateTime, + command: String, + cwd: String, + exit: i64, + duration: i64, + session: Option, + hostname: Option, + ) -> Self { + let session = session + .or_else(|| env::var("ATUIN_SESSION").ok()) + .unwrap_or_else(uuid_v4); + let hostname = + hostname.unwrap_or_else(|| format!("{}:{}", whoami::hostname(), whoami::username())); + + Self { + id: uuid_v4(), + timestamp, + command, + cwd, + exit, + duration, + session, + hostname, + } + } +} + +impl PartialEq for History { + // for the sakes of listing unique history only, we do not care about + // anything else + // obviously this does not refer to the *same* item of history, but when + // we only render the command, it looks the same + fn eq(&self, other: &Self) -> bool { + self.command == other.command + } +} + +impl Eq for History {} + +impl Hash for History { + fn hash(&self, state: &mut H) { + self.command.hash(state); + } +} -- cgit v1.3.1