use crate::observe::{FILE_FIELD_NAME, LINE_FIELD_NAME};
use tracing::field::{Field, Visit};
use std::fmt;
#[derive(Default)]
pub(crate) struct LocationVisitor {
pub(crate) file: Option<String>,
pub(crate) line: Option<u32>,
}
impl LocationVisitor {
pub(crate) fn new() -> Self {
Self::default()
}
}
impl Visit for LocationVisitor {
fn record_debug(&mut self, _field: &Field, _value: &dyn fmt::Debug) {}
fn record_u64(&mut self, field: &Field, value: u64) {
if field.name() == LINE_FIELD_NAME {
self.line = Some(value as u32);
}
}
fn record_str(&mut self, field: &Field, value: &str) {
if field.name() == FILE_FIELD_NAME {
self.file = Some(value.to_string());
}
}
}
#[derive(Default)]
pub(crate) struct MessageVisitor(pub(crate) String);
impl MessageVisitor {
const FIELD_NAME: &'static str = "message";
}
impl Visit for MessageVisitor {
fn record_debug(&mut self, field: &tracing::field::Field, value: &dyn std::fmt::Debug) {
if field.name() == Self::FIELD_NAME {
self.0 = format!("{:?}", value);
}
}
}