1#[cfg(feature = "axum")]
2mod extract;
3
4mod layer;
5
6pub use crate::layer::SetTraceIdLayer;
7use std::fmt::{Display, Formatter};
8use uuid::Uuid;
9
10pub trait MakeTraceId: Send + Sync + Display + Clone {
37 fn make_trace_id() -> Self;
38}
39
40impl MakeTraceId for String {
41 fn make_trace_id() -> Self {
42 Uuid::new_v4().to_string()
43 }
44}
45
46#[derive(Debug, Clone)]
47pub struct TraceId<T>
48where
49 T: MakeTraceId,
50{
51 pub id: T,
52}
53
54impl<T> TraceId<T>
55where
56 T: MakeTraceId,
57{
58 pub(crate) fn new() -> Self {
59 TraceId {
60 id: T::make_trace_id(),
61 }
62 }
63}
64
65impl<T> Display for TraceId<T>
66where
67 T: MakeTraceId,
68{
69 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
70 write!(f, "{}", self.id)
71 }
72}