aboutsummaryrefslogtreecommitdiffstats
path: root/src/command/client/search
diff options
context:
space:
mode:
authorBaptiste <32563450+BapRx@users.noreply.github.com>2023-01-26 11:57:52 +0100
committerGitHub <noreply@github.com>2023-01-26 10:57:52 +0000
commit893a395f12d29b6b6676db3672fb7e600c49aff7 (patch)
tree2944bc8b07ec3dd44eca75fa411a5dc1d93fa1c6 /src/command/client/search
parentUpdate contributors.rs (diff)
downloadatuin-893a395f12d29b6b6676db3672fb7e600c49aff7.zip
feat(history): Add new flag to allow custom output format (#662)
* feat(history): Add new flag to allow custom output format * more efficient formatting * add user and host * docs Co-authored-by: Conrad Ludgate <conrad.ludgate@truelayer.com>
Diffstat (limited to '')
-rw-r--r--src/command/client/search.rs11
-rw-r--r--src/command/client/search/duration.rs26
2 files changed, 28 insertions, 9 deletions
diff --git a/src/command/client/search.rs b/src/command/client/search.rs
index e528576d..53471ec1 100644
--- a/src/command/client/search.rs
+++ b/src/command/client/search.rs
@@ -16,7 +16,7 @@ mod duration;
mod event;
mod history_list;
mod interactive;
-pub use duration::format_duration;
+pub use duration::{format_duration, format_duration_into};
#[allow(clippy::struct_excessive_bools)]
#[derive(Parser)]
@@ -74,6 +74,11 @@ pub struct Cmd {
/// Show only the text of the command
#[arg(long)]
cmd_only: bool,
+
+ /// Available variables: {command}, {directory}, {duration}, {user}, {host} and {time}.
+ /// Example: --format "{time} - [{duration}] - {directory}$\t{command}"
+ #[arg(long, short)]
+ format: Option<String>,
}
impl Cmd {
@@ -97,6 +102,7 @@ impl Cmd {
self.exit,
self.exclude_exit,
self.exclude_cwd,
+ self.format,
self.before,
self.after,
self.limit,
@@ -122,6 +128,7 @@ async fn run_non_interactive(
exit: Option<i64>,
exclude_exit: Option<i64>,
exclude_cwd: Option<String>,
+ format: Option<String>,
before: Option<String>,
after: Option<String>,
limit: Option<i64>,
@@ -202,6 +209,6 @@ async fn run_non_interactive(
.map(std::borrow::ToOwned::to_owned)
.collect();
- super::history::print_list(&results, list_mode);
+ super::history::print_list(&results, list_mode, format.as_deref());
Ok(results.len())
}
diff --git a/src/command/client/search/duration.rs b/src/command/client/search/duration.rs
index 1dc4245f..08dadb95 100644
--- a/src/command/client/search/duration.rs
+++ b/src/command/client/search/duration.rs
@@ -1,10 +1,11 @@
+use core::fmt;
use std::{ops::ControlFlow, time::Duration};
#[allow(clippy::module_name_repetitions)]
-pub fn format_duration(f: Duration) -> String {
- fn item(name: &str, value: u64) -> ControlFlow<String> {
+pub fn format_duration_into(dur: Duration, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ fn item(unit: &'static str, value: u64) -> ControlFlow<(&'static str, u64)> {
if value > 0 {
- ControlFlow::Break(format!("{value}{name}"))
+ ControlFlow::Break((unit, value))
} else {
ControlFlow::Continue(())
}
@@ -13,7 +14,7 @@ pub fn format_duration(f: Duration) -> String {
// impl taken and modified from
// https://github.com/tailhook/humantime/blob/master/src/duration.rs#L295-L331
// Copyright (c) 2016 The humantime Developers
- fn fmt(f: Duration) -> ControlFlow<String, ()> {
+ fn fmt(f: Duration) -> ControlFlow<(&'static str, u64), ()> {
let secs = f.as_secs();
let nanos = f.subsec_nanos();
@@ -43,8 +44,19 @@ pub fn format_duration(f: Duration) -> String {
ControlFlow::Continue(())
}
- match fmt(f) {
- ControlFlow::Break(b) => b,
- ControlFlow::Continue(()) => String::from("0s"),
+ match fmt(dur) {
+ ControlFlow::Break((unit, value)) => write!(f, "{value}{unit}"),
+ ControlFlow::Continue(()) => write!(f, "0s"),
+ }
+}
+
+#[allow(clippy::module_name_repetitions)]
+pub fn format_duration(f: Duration) -> String {
+ struct F(Duration);
+ impl fmt::Display for F {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ format_duration_into(self.0, f)
+ }
}
+ F(f).to_string()
}