use std::borrow::Cow;
use std::collections::BTreeMap;
use std::fmt;
use tracing::field::{Field, Visit};
#[derive(Debug)]
pub(crate) struct FieldVisitor {
fields: BTreeMap<Cow<'static, str>, Cow<'static, str>>,
}
impl FieldVisitor {
pub fn new() -> Self {
Self {
fields: BTreeMap::new(),
}
}
pub fn into_fields(self) -> BTreeMap<Cow<'static, str>, Cow<'static, str>> {
self.fields
}
#[allow(dead_code)]
pub fn fields(&self) -> &BTreeMap<Cow<'static, str>, Cow<'static, str>> {
&self.fields
}
}
impl Visit for FieldVisitor {
fn record_f64(&mut self, field: &Field, value: f64) {
self.fields
.insert(Cow::Borrowed(field.name()), Cow::Owned(value.to_string()));
}
fn record_i64(&mut self, field: &Field, value: i64) {
self.fields
.insert(Cow::Borrowed(field.name()), Cow::Owned(value.to_string()));
}
fn record_u64(&mut self, field: &Field, value: u64) {
self.fields
.insert(Cow::Borrowed(field.name()), Cow::Owned(value.to_string()));
}
fn record_bool(&mut self, field: &Field, value: bool) {
self.fields
.insert(Cow::Borrowed(field.name()), Cow::Owned(value.to_string()));
}
fn record_str(&mut self, field: &Field, value: &str) {
self.fields
.insert(Cow::Borrowed(field.name()), Cow::Owned(value.to_string()));
}
fn record_error(&mut self, field: &Field, value: &(dyn std::error::Error + 'static)) {
self.fields
.insert(Cow::Borrowed(field.name()), Cow::Owned(value.to_string()));
}
fn record_debug(&mut self, field: &Field, value: &dyn fmt::Debug) {
self.fields.insert(
Cow::Borrowed(field.name()),
Cow::Owned(format!("{:?}", value)),
);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_empty_visitor() {
let visitor = FieldVisitor::new();
let fields = visitor.into_fields();
assert!(fields.is_empty());
}
#[test]
fn test_visitor_fields_reference() {
let visitor = FieldVisitor::new();
assert!(visitor.fields().is_empty());
}
}