pub struct History {
pub id: HistoryId,
pub timestamp: OffsetDateTime,
pub duration: i64,
pub exit: i64,
pub command: String,
pub cwd: String,
pub session: String,
pub hostname: String,
pub deleted_at: Option<OffsetDateTime>,
}
Expand description
Client-side history entry.
Client stores data unencrypted, and only encrypts it before sending to the server.
To create a new history entry, use one of the builders:
History::import()
to import an entry from the shell history fileHistory::capture()
to capture an entry via hookHistory::from_db()
to create an instance from the database entry
Fields§
§id: HistoryId
A client-generated ID, used to identify the entry when syncing.
Stored as client_id
in the database.
timestamp: OffsetDateTime
When the command was run.
duration: i64
How long the command took to run.
exit: i64
The exit code of the command.
command: String
The command that was run.
cwd: String
The current working directory when the command was run.
session: String
The session ID, associated with a terminal session.
hostname: String
The hostname of the machine the command was run on.
deleted_at: Option<OffsetDateTime>
Timestamp, which is set when the entry is deleted, allowing a soft delete.
Implementations§
Source§impl History
impl History
pub fn serialize(&self) -> Result<DecryptedData>
pub fn deserialize(bytes: &[u8], version: &str) -> Result<History>
Sourcepub fn import() -> HistoryImportedBuilder
pub fn import() -> HistoryImportedBuilder
Builder for a history entry that is imported from shell history.
The only two required fields are timestamp
and command
.
§Examples
use atuin_client::history::History;
let history: History = History::import()
.timestamp(time::OffsetDateTime::now_utc())
.command("ls -la")
.build()
.into();
If shell history contains more information, it can be added to the builder:
use atuin_client::history::History;
let history: History = History::import()
.timestamp(time::OffsetDateTime::now_utc())
.command("ls -la")
.cwd("/home/user")
.exit(0)
.duration(100)
.build()
.into();
Unknown command or command without timestamp cannot be imported, which is forced at compile time:
use atuin_client::history::History;
// this will not compile because timestamp is missing
let history: History = History::import()
.command("ls -la")
.build()
.into();
Sourcepub fn capture() -> HistoryCapturedBuilder
pub fn capture() -> HistoryCapturedBuilder
Builder for a history entry that is captured via hook.
This builder is used only at the start
step of the hook,
so it doesn’t have any fields which are known only after
the command is finished, such as exit
or duration
.
§Examples
use atuin_client::history::History;
let history: History = History::capture()
.timestamp(time::OffsetDateTime::now_utc())
.command("ls -la")
.cwd("/home/user")
.build()
.into();
Command without any required info cannot be captured, which is forced at compile time:
use atuin_client::history::History;
// this will not compile because `cwd` is missing
let history: History = History::capture()
.timestamp(time::OffsetDateTime::now_utc())
.command("ls -la")
.build()
.into();
Sourcepub fn daemon() -> HistoryDaemonCaptureBuilder
pub fn daemon() -> HistoryDaemonCaptureBuilder
Builder for a history entry that is captured via hook, and sent to the daemon.
This builder is used only at the start
step of the hook,
so it doesn’t have any fields which are known only after
the command is finished, such as exit
or duration
.
It does, however, include information that can usually be inferred.
This is because the daemon we are sending a request to lacks the context of the command
§Examples
use atuin_client::history::History;
let history: History = History::daemon()
.timestamp(time::OffsetDateTime::now_utc())
.command("ls -la")
.cwd("/home/user")
.session("018deb6e8287781f9973ef40e0fde76b")
.hostname("computer:ellie")
.build()
.into();
Command without any required info cannot be captured, which is forced at compile time:
use atuin_client::history::History;
// this will not compile because `hostname` is missing
let history: History = History::daemon()
.timestamp(time::OffsetDateTime::now_utc())
.command("ls -la")
.cwd("/home/user")
.session("018deb6e8287781f9973ef40e0fde76b")
.build()
.into();
Sourcepub fn from_db() -> HistoryFromDbBuilder
pub fn from_db() -> HistoryFromDbBuilder
Builder for a history entry that is imported from the database.
All fields are required, as they are all present in the database.
use atuin_client::history::History;
// this will not compile because `id` field is missing
let history: History = History::from_db()
.timestamp(time::OffsetDateTime::now_utc())
.command("ls -la".to_string())
.cwd("/home/user".to_string())
.exit(0)
.duration(100)
.session("somesession".to_string())
.hostname("localhost".to_string())
.deleted_at(None)
.build()
.into();
pub fn success(&self) -> bool
pub fn should_save(&self, settings: &Settings) -> bool
Trait Implementations§
Source§impl From<HistDbEntry> for History
impl From<HistDbEntry> for History
Source§fn from(histdb_item: HistDbEntry) -> Self
fn from(histdb_item: HistDbEntry) -> Self
Source§impl<'a, R: Row> FromRow<'a, R> for Historywhere
&'a str: ColumnIndex<R>,
HistoryId: Decode<'a, R::Database> + Type<R::Database>,
OffsetDateTime: Decode<'a, R::Database> + Type<R::Database>,
i64: Decode<'a, R::Database> + Type<R::Database>,
String: Decode<'a, R::Database> + Type<R::Database>,
Option<OffsetDateTime>: Decode<'a, R::Database> + Type<R::Database>,
impl<'a, R: Row> FromRow<'a, R> for Historywhere
&'a str: ColumnIndex<R>,
HistoryId: Decode<'a, R::Database> + Type<R::Database>,
OffsetDateTime: Decode<'a, R::Database> + Type<R::Database>,
i64: Decode<'a, R::Database> + Type<R::Database>,
String: Decode<'a, R::Database> + Type<R::Database>,
Option<OffsetDateTime>: Decode<'a, R::Database> + Type<R::Database>,
impl Eq for History
impl StructuralPartialEq for History
Auto Trait Implementations§
impl Freeze for History
impl RefUnwindSafe for History
impl Send for History
impl Sync for History
impl Unpin for History
impl UnwindSafe for History
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters
when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle
.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other
into Self
, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T
.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters
when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self
into T
, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors
fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds
error is returned which contains
the unclamped color. Read more