diff options
Diffstat (limited to 'vendor/tracing-tree/src/lib.rs')
-rw-r--r-- | vendor/tracing-tree/src/lib.rs | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/vendor/tracing-tree/src/lib.rs b/vendor/tracing-tree/src/lib.rs index 266523b73..ec3467493 100644 --- a/vendor/tracing-tree/src/lib.rs +++ b/vendor/tracing-tree/src/lib.rs @@ -1,6 +1,9 @@ pub(crate) mod format; +pub mod time; +use crate::time::FormatTime; use format::{Buffers, ColorLevel, Config, FmtEvent, SpanMode}; + use nu_ansi_term::{Color, Style}; use std::{ fmt::{self, Write as _}, @@ -43,13 +46,15 @@ impl Visit for Data { } } #[derive(Debug)] -pub struct HierarchicalLayer<W = fn() -> io::Stderr> +pub struct HierarchicalLayer<W = fn() -> io::Stderr, FT = ()> where W: for<'writer> MakeWriter<'writer> + 'static, + FT: FormatTime, { make_writer: W, bufs: Mutex<Buffers>, config: Config, + timer: FT, } impl Default for HierarchicalLayer { @@ -70,13 +75,15 @@ impl HierarchicalLayer<fn() -> io::Stderr> { make_writer: io::stderr, bufs: Mutex::new(Buffers::new()), config, + timer: (), } } } -impl<W> HierarchicalLayer<W> +impl<W, FT> HierarchicalLayer<W, FT> where W: for<'writer> MakeWriter<'writer> + 'static, + FT: FormatTime, { /// Enables terminal colors, boldness and italics. pub fn with_ansi(self, ansi: bool) -> Self { @@ -86,7 +93,7 @@ where } } - pub fn with_writer<W2>(self, make_writer: W2) -> HierarchicalLayer<W2> + pub fn with_writer<W2>(self, make_writer: W2) -> HierarchicalLayer<W2, FT> where W2: for<'writer> MakeWriter<'writer>, { @@ -94,6 +101,7 @@ where make_writer, config: self.config, bufs: self.bufs, + timer: self.timer, } } @@ -113,6 +121,16 @@ where } } + /// Specifies how to measure and format time at which event has occurred. + pub fn with_timer<FT2: FormatTime>(self, timer: FT2) -> HierarchicalLayer<W, FT2> { + HierarchicalLayer { + make_writer: self.make_writer, + config: self.config, + bufs: self.bufs, + timer, + } + } + /// Whether to render the event and span targets. Usually targets are the module path to the /// event/span macro invocation. pub fn with_targets(self, targets: bool) -> Self { @@ -274,10 +292,11 @@ where } } -impl<S, W> Layer<S> for HierarchicalLayer<W> +impl<S, W, FT> Layer<S> for HierarchicalLayer<W, FT> where S: Subscriber + for<'span> LookupSpan<'span>, W: for<'writer> MakeWriter<'writer> + 'static, + FT: FormatTime + 'static, { fn on_new_span(&self, attrs: &Attributes, id: &Id, ctx: Context<S>) { let span = ctx.span(id).expect("in new_span but span does not exist"); @@ -306,15 +325,26 @@ where let bufs = &mut *guard; let mut event_buf = &mut bufs.current_buf; + // Time. + + { + let prev_buffer_len = event_buf.len(); + + self.timer + .format_time(&mut event_buf) + .expect("Unable to write time to buffer"); + + // Something was written to the buffer, pad it with a space. + if prev_buffer_len < event_buf.len() { + write!(event_buf, " ").expect("Unable to write to buffer"); + } + } + // printing the indentation - let indent = if ctx.current_span().id().is_some() { - // size hint isn't implemented on Scope. - ctx.event_scope(event) - .expect("Unable to get span scope; this is a bug") - .count() - } else { - 0 - }; + let indent = ctx + .event_scope(event) + .map(|scope| scope.count()) + .unwrap_or(0); // check if this event occurred in the context of a span. // if it has, get the start time of this span. |