use serde::{Deserialize, Serialize};
use tracing::{Level, Metadata};
#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq, Eq, Hash)]
pub struct OwnedFieldSet {
names: Vec<String>,
}
impl From<&tracing::field::FieldSet> for OwnedFieldSet {
fn from(fs: &tracing::field::FieldSet) -> Self {
Self {
names: fs.iter().map(|field| field.to_string()).collect(),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq, Eq, Hash)]
pub struct OwnedMetadata {
pub name: String,
pub target: String,
pub level: String,
pub module_path: Option<String>,
#[serde(skip_serializing)]
pub file: Option<String>,
#[serde(skip_serializing)]
pub line: Option<u32>,
pub fields: OwnedFieldSet,
#[serde(skip_serializing)]
pub span_id: Option<u64>,
}
impl From<&Metadata<'_>> for OwnedMetadata {
fn from(md: &Metadata) -> Self {
Self {
name: md.name().to_string(),
target: md.target().to_string(),
level: md.level().to_string(),
module_path: md.module_path().map(std::string::ToString::to_string),
file: md.file().map(std::string::ToString::to_string),
line: md.line(),
fields: md.fields().into(),
span_id: None,
}
}
}
impl OwnedMetadata {
pub fn with_span_id(self, span_id: u64) -> Self {
Self {
span_id: Some(span_id),
..self
}
}
pub fn is_enabled(&self, max_verbosity_level: &Level) -> bool {
&self.level.parse::<tracing::Level>().unwrap_or(Level::INFO) <= max_verbosity_level
}
}