use devtools_wire_format::Field;
use std::fmt::Debug;
use tracing_subscriber::field::Visit;
pub struct FieldVisitor {
meta_id: u64,
fields: Vec<Field>,
}
pub struct EventVisitor {
field_visitor: FieldVisitor,
message: Option<String>,
}
impl FieldVisitor {
pub(crate) fn new(meta_id: u64) -> Self {
Self {
fields: Vec::default(),
meta_id,
}
}
pub(crate) fn result(self) -> Vec<Field> {
self.fields
}
}
impl EventVisitor {
pub(crate) fn new(meta_id: u64) -> Self {
Self {
field_visitor: FieldVisitor::new(meta_id),
message: None,
}
}
pub(crate) fn result(self) -> (Option<String>, Vec<Field>) {
(self.message, self.field_visitor.result())
}
}
impl Visit for FieldVisitor {
fn record_f64(&mut self, field: &tracing_core::Field, value: f64) {
self.fields.push(Field {
metadata_id: self.meta_id,
name: field.name().into(),
value: Some(value.into()),
});
}
fn record_i64(&mut self, field: &tracing_core::Field, value: i64) {
self.fields.push(Field {
metadata_id: self.meta_id,
name: field.name().into(),
value: Some(value.into()),
});
}
fn record_u64(&mut self, field: &tracing_core::Field, value: u64) {
self.fields.push(Field {
metadata_id: self.meta_id,
name: field.name().into(),
value: Some(value.into()),
});
}
fn record_bool(&mut self, field: &tracing_core::Field, value: bool) {
self.fields.push(Field {
metadata_id: self.meta_id,
name: field.name().into(),
value: Some(value.into()),
});
}
fn record_str(&mut self, field: &tracing_core::Field, value: &str) {
self.fields.push(Field {
metadata_id: self.meta_id,
name: field.name().into(),
value: Some(value.into()),
});
}
fn record_debug(&mut self, field: &tracing_core::Field, value: &dyn Debug) {
self.fields.push(Field {
metadata_id: self.meta_id,
name: field.name().into(),
value: Some(value.into()),
});
}
}
impl Visit for EventVisitor {
fn record_f64(&mut self, field: &tracing_core::Field, value: f64) {
match field.name() {
"message" if self.message.is_none() => self.message = Some(value.to_string()),
_ => self.field_visitor.record_f64(field, value),
}
}
fn record_i64(&mut self, field: &tracing_core::Field, value: i64) {
match field.name() {
"message" if self.message.is_none() => self.message = Some(value.to_string()),
_ => self.field_visitor.record_i64(field, value),
}
}
fn record_u64(&mut self, field: &tracing_core::Field, value: u64) {
match field.name() {
"message" if self.message.is_none() => self.message = Some(value.to_string()),
_ => self.field_visitor.record_u64(field, value),
}
}
fn record_bool(&mut self, field: &tracing_core::Field, value: bool) {
match field.name() {
"message" if self.message.is_none() => self.message = Some(value.to_string()),
_ => self.field_visitor.record_bool(field, value),
}
}
fn record_str(&mut self, field: &tracing_core::Field, value: &str) {
match field.name() {
"message" if self.message.is_none() => self.message = Some(value.to_string()),
_ => self.field_visitor.record_str(field, value),
}
}
fn record_debug(&mut self, field: &tracing_core::Field, value: &dyn Debug) {
match field.name() {
"message" if self.message.is_none() => self.message = Some(format!("{value:?}")),
_ => self.field_visitor.record_debug(field, value),
}
}
}