1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
use typed_builder::TypedBuilder;
use super::History;
/// Builder for a history entry that is loaded from the database.
///
/// All fields are required, as they are all present in the database.
#[derive(Debug, Clone, TypedBuilder)]
pub struct HistoryFromDb {
id: String,
timestamp: time::OffsetDateTime,
command: String,
cwd: String,
exit: i64,
duration: i64,
session: String,
hostname: String,
author: String,
intent: Option<String>,
deleted_at: Option<time::OffsetDateTime>,
}
impl From<HistoryFromDb> for History {
fn from(from_db: HistoryFromDb) -> Self {
Self {
id: from_db.id.into(),
timestamp: from_db.timestamp,
exit: from_db.exit,
command: from_db.command,
cwd: from_db.cwd,
duration: from_db.duration,
session: from_db.session,
hostname: from_db.hostname,
author: from_db.author,
intent: from_db.intent,
deleted_at: from_db.deleted_at,
}
}
}
/// Builder for a history entry that is captured via hook and sent to the daemon
///
/// This builder is similar to Capture, but we just require more information up front.
/// For the old setup, we could just rely on `History::new` to read some of the missing
/// data. This is no longer the case.
#[derive(Debug, Clone, TypedBuilder)]
pub struct HistoryDaemonCapture {
timestamp: time::OffsetDateTime,
#[builder(setter(into))]
command: String,
#[builder(setter(into))]
cwd: String,
#[builder(setter(into))]
session: String,
#[builder(setter(into))]
hostname: String,
#[builder(default, setter(strip_option, into))]
author: Option<String>,
#[builder(default, setter(strip_option, into))]
intent: Option<String>,
}
impl From<HistoryDaemonCapture> for History {
fn from(captured: HistoryDaemonCapture) -> Self {
Self::new(
captured.timestamp,
captured.command,
captured.cwd,
-1,
-1,
captured.session,
captured.hostname,
captured.author,
captured.intent,
None,
)
}
}
|