1 //! `MakeVisitor` wrappers for working with `fmt::Display` fields.
2 use super::{MakeVisitor, VisitFmt, VisitOutput}
;
3 use tracing_core
::field
::{Field, Visit}
;
7 /// A visitor wrapper that ensures any strings named "message" are formatted
8 /// using `fmt::Display`
9 #[derive(Debug, Clone)]
10 pub struct Messages
<V
>(V
);
12 // TODO(eliza): When `error` as a primitive type is stable, add a
13 // `DisplayErrors` wrapper...
15 // === impl Messages ===
18 /// Returns a new [`MakeVisitor`] implementation that will wrap `inner` so
19 /// that any strings named `message` are formatted using `fmt::Display`.
21 /// [`MakeVisitor`]: super::MakeVisitor
22 pub fn new(inner
: V
) -> Self {
27 impl<T
, V
> MakeVisitor
<T
> for Messages
<V
>
31 type Visitor
= Messages
<V
::Visitor
>;
34 fn make_visitor(&self, target
: T
) -> Self::Visitor
{
35 Messages(self.0.make_visitor(target
))
39 impl<V
> Visit
for Messages
<V
>
44 fn record_f64(&mut self, field
: &Field
, value
: f64) {
45 self.0.record_f64(field
, value
)
49 fn record_i64(&mut self, field
: &Field
, value
: i64) {
50 self.0.record_i64(field
, value
)
54 fn record_u64(&mut self, field
: &Field
, value
: u64) {
55 self.0.record_u64(field
, value
)
59 fn record_bool(&mut self, field
: &Field
, value
: bool
) {
60 self.0.record_bool(field
, value
)
63 /// Visit a string value.
64 fn record_str(&mut self, field
: &Field
, value
: &str) {
65 if field
.name() == "message" {
66 self.0.record_debug(field
, &format_args
!("{}", value
))
68 self.0.record_str(field
, value
)
72 // TODO(eliza): add RecordError when stable
73 // fn record_error(&mut self, field: &Field, value: &(dyn std::error::Error + 'static)) {
74 // self.record_debug(field, &format_args!("{}", value))
78 fn record_debug(&mut self, field
: &Field
, value
: &dyn fmt
::Debug
) {
79 self.0.record_debug(field
, value
)
83 impl<V
, O
> VisitOutput
<O
> for Messages
<V
>
88 fn finish(self) -> O
{
95 use super::VisitWrite
;
98 impl<V
> VisitWrite
for Messages
<V
>
103 fn writer(&mut self) -> &mut dyn io
::Write
{
109 impl<V
> VisitFmt
for Messages
<V
>
114 fn writer(&mut self) -> &mut dyn fmt
::Write
{