summaryrefslogtreecommitdiffstats
path: root/atuin-client/src/history.rs
diff options
context:
space:
mode:
Diffstat (limited to 'atuin-client/src/history.rs')
-rw-r--r--atuin-client/src/history.rs66
1 files changed, 66 insertions, 0 deletions
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<Utc>,
+ 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<Utc>,
+ command: String,
+ cwd: String,
+ exit: i64,
+ duration: i64,
+ session: Option<String>,
+ hostname: Option<String>,
+ ) -> 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<H: Hasher>(&self, state: &mut H) {
+ self.command.hash(state);
+ }
+}