use std::collections::BTreeMap;
use std::fmt;
use tracing_core::{Field, field::Visit};
#[derive(Debug, Default)]
pub(crate) struct JsonStorage<'a> {
pub(crate) values: BTreeMap<&'a str, serde_json::Value>,
}
impl<'a> JsonStorage<'a> {
pub(crate) fn values(&self) -> &BTreeMap<&'a str, serde_json::Value> {
&self.values
}
}
impl Visit for JsonStorage<'_> {
fn record_i64(&mut self, field: &Field, value: i64) {
self.values
.insert(field.name(), serde_json::Value::from(value));
}
fn record_u64(&mut self, field: &Field, value: u64) {
self.values
.insert(field.name(), serde_json::Value::from(value));
}
fn record_f64(&mut self, field: &Field, value: f64) {
self.values
.insert(field.name(), serde_json::Value::from(value));
}
fn record_bool(&mut self, field: &Field, value: bool) {
self.values
.insert(field.name(), serde_json::Value::from(value));
}
fn record_str(&mut self, field: &Field, value: &str) {
self.values
.insert(field.name(), serde_json::Value::from(value));
}
fn record_debug(&mut self, field: &Field, value: &dyn fmt::Debug) {
match field.name() {
name if name.starts_with("log.") => (),
name if name.starts_with("r#") => {
self.values
.insert(&name[2..], serde_json::Value::from(format!("{:?}", value)));
}
name => {
self.values
.insert(name, serde_json::Value::from(format!("{:?}", value)));
}
};
}
}