mas_tower/tracing/
make_span.rs1use tracing::Span;
8
9use super::enrich_span::EnrichSpan;
10use crate::utils::FnWrapper;
11
12pub trait MakeSpan<R> {
14 fn make_span(&self, request: &R) -> Span;
15}
16
17impl<R, F> MakeSpan<R> for FnWrapper<F>
18where
19 F: Fn(&R) -> Span,
20{
21 fn make_span(&self, request: &R) -> Span {
22 (self.0)(request)
23 }
24}
25
26pub fn make_span_fn<R, F>(f: F) -> FnWrapper<F>
28where
29 F: Fn(&R) -> Span,
30{
31 FnWrapper(f)
32}
33
34macro_rules! impl_for_tuple {
37 (M, $($T:ident),+) => {
38 impl<R, M, $($T),+> MakeSpan<R> for (M, $($T),+)
39 where
40 M: MakeSpan<R>,
41 $($T: EnrichSpan<R>),+
42 {
43 fn make_span(&self, request: &R) -> Span {
44 #[allow(non_snake_case)]
45 let (ref m, $(ref $T),+) = *self;
46
47 let span = m.make_span(request);
48 $(
49 $T.enrich_span(&span, request);
50 )+
51 span
52 }
53 }
54 };
55}
56
57impl_for_tuple!(M, T1);
58impl_for_tuple!(M, T1, T2);
59impl_for_tuple!(M, T1, T2, T3);
60impl_for_tuple!(M, T1, T2, T3, T4);
61impl_for_tuple!(M, T1, T2, T3, T4, T5);
62impl_for_tuple!(M, T1, T2, T3, T4, T5, T6);
63impl_for_tuple!(M, T1, T2, T3, T4, T5, T6, T7);
64impl_for_tuple!(M, T1, T2, T3, T4, T5, T6, T7, T8);