#[cfg(feature = "writers")]
pub mod default;
#[cfg(feature = "writers")]
mod json;
#[cfg(feature = "writers")]
pub use json::*;
use serde_json::{json, Value};
use std::{collections::BTreeMap, fmt::Debug};
use tracing::field::{Field, Visit};
pub struct JsonVisitor<'b>(pub &'b mut BTreeMap<String, Value>);
macro_rules! impl_visitor_instructions {
($($name:ident => $ty:ty),*) => {
$(
fn $name(&mut self, field: &::tracing::field::Field, value: $ty) {
self.0.insert(field.name().to_string(), ::serde_json::json!(value));
}
)*
}
}
impl Visit for JsonVisitor<'_> {
impl_visitor_instructions! {
record_f64 => f64,
record_i64 => i64,
record_u64 => u64,
record_i128 => i128,
record_bool => bool,
record_str => &str,
record_u128 => u128
}
fn record_error(&mut self, field: &Field, value: &(dyn std::error::Error + 'static)) {
self.0.insert(field.name().to_string(), json!(format!("{value}")));
}
fn record_debug(&mut self, field: &Field, value: &dyn Debug) {
self.0.insert(field.name().to_string(), json!(format!("{value:?}")));
}
}