#[cfg(feature = "axum")]
mod extract;
mod layer;
pub use crate::layer::SetTraceIdLayer;
use std::fmt::{Display, Formatter};
use uuid::Uuid;
pub trait MakeTraceId: Send + Sync + Display + Clone {
fn make_trace_id() -> Self;
}
impl MakeTraceId for String {
fn make_trace_id() -> Self {
Uuid::new_v4().to_string()
}
}
#[derive(Debug, Clone)]
pub struct TraceId<T>
where
T: MakeTraceId,
{
pub id: T,
}
impl<T> TraceId<T>
where
T: MakeTraceId,
{
pub(crate) fn new() -> Self {
TraceId {
id: T::make_trace_id(),
}
}
}
impl<T> Display for TraceId<T>
where
T: MakeTraceId,
{
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.id)
}
}