tracing_subscriber/field/
debug.rs

1//! `MakeVisitor` wrappers for working with `fmt::Debug` fields.
2use super::{MakeVisitor, VisitFmt, VisitOutput};
3use tracing_core::field::{Field, Visit};
4
5use core::fmt;
6
7/// A visitor wrapper that ensures any `fmt::Debug` fields are formatted using
8/// the alternate (`:#`) formatter.
9#[derive(Debug, Clone)]
10pub struct Alt<V>(V);
11
12// TODO(eliza): When `error` as a primitive type is stable, add a
13// `DisplayErrors` wrapper...
14
15// === impl Alt ===
16//
17impl<V> Alt<V> {
18    /// Wraps the provided visitor so that any `fmt::Debug` fields are formatted
19    /// using the alternative (`:#`) formatter.
20    pub fn new(inner: V) -> Self {
21        Alt(inner)
22    }
23}
24
25impl<T, V> MakeVisitor<T> for Alt<V>
26where
27    V: MakeVisitor<T>,
28{
29    type Visitor = Alt<V::Visitor>;
30
31    #[inline]
32    fn make_visitor(&self, target: T) -> Self::Visitor {
33        Alt(self.0.make_visitor(target))
34    }
35}
36
37impl<V> Visit for Alt<V>
38where
39    V: Visit,
40{
41    #[inline]
42    fn record_f64(&mut self, field: &Field, value: f64) {
43        self.0.record_f64(field, value)
44    }
45
46    #[inline]
47    fn record_i64(&mut self, field: &Field, value: i64) {
48        self.0.record_i64(field, value)
49    }
50
51    #[inline]
52    fn record_u64(&mut self, field: &Field, value: u64) {
53        self.0.record_u64(field, value)
54    }
55
56    #[inline]
57    fn record_bool(&mut self, field: &Field, value: bool) {
58        self.0.record_bool(field, value)
59    }
60
61    /// Visit a string value.
62    fn record_str(&mut self, field: &Field, value: &str) {
63        self.0.record_str(field, value)
64    }
65
66    // TODO(eliza): add RecordError when stable
67    // fn record_error(&mut self, field: &Field, value: &(dyn std::error::Error + 'static)) {
68    //     self.record_debug(field, &format_args!("{}", value))
69    // }
70
71    #[inline]
72    fn record_debug(&mut self, field: &Field, value: &dyn fmt::Debug) {
73        self.0.record_debug(field, &format_args!("{:#?}", value))
74    }
75}
76
77impl<V, O> VisitOutput<O> for Alt<V>
78where
79    V: VisitOutput<O>,
80{
81    #[inline]
82    fn finish(self) -> O {
83        self.0.finish()
84    }
85}
86
87feature! {
88    #![feature = "std"]
89    use super::VisitWrite;
90    use std::io;
91
92    impl<V> VisitWrite for Alt<V>
93    where
94        V: VisitWrite,
95    {
96        #[inline]
97        fn writer(&mut self) -> &mut dyn io::Write {
98            self.0.writer()
99        }
100    }
101}
102
103impl<V> VisitFmt for Alt<V>
104where
105    V: VisitFmt,
106{
107    #[inline]
108    fn writer(&mut self) -> &mut dyn fmt::Write {
109        self.0.writer()
110    }
111}