aboutsummaryrefslogtreecommitdiffstats
path: root/crates/atuin-ai/src/history_format.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/atuin-ai/src/history_format.rs')
-rw-r--r--crates/atuin-ai/src/history_format.rs120
1 files changed, 120 insertions, 0 deletions
diff --git a/crates/atuin-ai/src/history_format.rs b/crates/atuin-ai/src/history_format.rs
new file mode 100644
index 00000000..24aa963e
--- /dev/null
+++ b/crates/atuin-ai/src/history_format.rs
@@ -0,0 +1,120 @@
+use atuin_client::history::History;
+use time::UtcOffset;
+
+pub(crate) fn current_local_offset() -> UtcOffset {
+ UtcOffset::current_local_offset().unwrap_or(UtcOffset::UTC)
+}
+
+pub(crate) fn format_last_command(history: &History, local_offset: UtcOffset) -> String {
+ format!(
+ "History ID: {} - `{}`\n{}",
+ history.id,
+ history.command,
+ format_history_metadata(history, local_offset)
+ )
+}
+
+pub(crate) fn format_history_search_result(
+ ordinal: usize,
+ history: &History,
+ local_offset: UtcOffset,
+) -> String {
+ format!(
+ "## #{}. (History ID: {}):\n`{}`\n{}\n",
+ ordinal,
+ history.id,
+ history.command,
+ format_history_metadata(history, local_offset)
+ )
+}
+
+fn format_history_metadata(history: &History, local_offset: UtcOffset) -> String {
+ format!(
+ "[{}] (in `{}`, exit {}){}",
+ format_timestamp(history, local_offset),
+ history.cwd,
+ history.exit,
+ format_duration(history.duration)
+ )
+}
+
+fn format_timestamp(history: &History, local_offset: UtcOffset) -> String {
+ let ts = history.timestamp.to_offset(local_offset);
+ format!(
+ "{:04}-{:02}-{:02} {:02}:{:02}:{:02}",
+ ts.year(),
+ ts.month() as u8,
+ ts.day(),
+ ts.hour(),
+ ts.minute(),
+ ts.second(),
+ )
+}
+
+fn format_duration(nanos: i64) -> String {
+ if nanos <= 0 {
+ return String::new();
+ }
+
+ let total_secs = nanos / 1_000_000_000;
+ let millis = (nanos % 1_000_000_000) / 1_000_000;
+
+ if total_secs >= 3600 {
+ let hours = total_secs / 3600;
+ let mins = (total_secs % 3600) / 60;
+ let secs = total_secs % 60;
+ format!(", {hours}h{mins}m{secs}s")
+ } else if total_secs >= 60 {
+ let mins = total_secs / 60;
+ let secs = total_secs % 60;
+ format!(", {mins}m{secs}s")
+ } else if total_secs > 0 {
+ if millis > 0 {
+ format!(", {total_secs}.{millis:03}s")
+ } else {
+ format!(", {total_secs}s")
+ }
+ } else {
+ format!(", {millis}ms")
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use atuin_client::history::{History, HistoryId};
+ use time::{OffsetDateTime, UtcOffset};
+
+ use super::*;
+
+ fn history(duration: i64) -> History {
+ History {
+ id: HistoryId("018f011c-9a0a-7000-8000-000000000001".to_string()),
+ timestamp: OffsetDateTime::UNIX_EPOCH,
+ duration,
+ exit: 2,
+ command: "cargo test".to_string(),
+ cwd: "/repo".to_string(),
+ session: String::new(),
+ hostname: String::new(),
+ author: String::new(),
+ intent: None,
+ deleted_at: None,
+ }
+ }
+
+ #[test]
+ fn formats_last_command() {
+ assert_eq!(
+ format_last_command(&history(1_234_000_000), UtcOffset::UTC),
+ "History ID: 018f011c-9a0a-7000-8000-000000000001 - `cargo test`\n[1970-01-01 00:00:00] (in `/repo`, exit 2), 1.234s"
+ );
+ }
+
+ #[test]
+ fn formats_history_search_result() {
+ assert_eq!(
+ format_history_search_result(3, &history(0), UtcOffset::UTC),
+ "## #3. (History ID: 018f011c-9a0a-7000-8000-000000000001):\n`cargo test`\n[1970-01-01 00:00:00] (in `/repo`, exit 2)\n"
+ );
+ }
+}