use tracing::{
field::{Field, Visit},
Subscriber,
};
use tracing_subscriber::{layer::Context, registry::LookupSpan};
use super::Chain;
pub(crate) struct SimpleEventVisitor<'a, S>
where
S: Subscriber + for<'l> LookupSpan<'l>,
{
pub(crate) tracing_context: &'a Context<'a, S>,
pub(crate) message: Option<String>,
pub(crate) chain: Chain,
}
impl<'a, S> SimpleEventVisitor<'a, S>
where
S: Subscriber + for<'l> LookupSpan<'l>,
{
pub(crate) fn new(
tracing_context: &'a Context<'a, S>,
) -> Self {
Self {
tracing_context,
message: None,
chain: Chain::default(),
}
}
}
impl<'a, S> Visit for SimpleEventVisitor<'a, S>
where
S: Subscriber + for<'l> LookupSpan<'l>,
{
fn record_str(
&mut self,
field: &Field,
value: &str,
) {
let name = field.name();
let value = value.to_owned();
if name == "message" {
self.message = Some(value);
}
}
fn record_debug(
&mut self,
field: &Field,
value: &dyn std::fmt::Debug,
) {
let name = field.name();
if name == "message" {
self.message = Some(format!("{:?}", value));
}
}
fn record_error(
&mut self,
_field: &Field,
value: &(dyn std::error::Error + 'static),
) {
self.chain = Chain::new(self.tracing_context, value);
}
}