mas_tower/tracing/
make_span.rs

1// Copyright 2024 New Vector Ltd.
2// Copyright 2023, 2024 The Matrix.org Foundation C.I.C.
3//
4// SPDX-License-Identifier: AGPL-3.0-only
5// Please see LICENSE in the repository root for full details.
6
7use tracing::Span;
8
9use super::enrich_span::EnrichSpan;
10use crate::utils::FnWrapper;
11
12/// A trait for creating a span for a request.
13pub 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
26/// Make span from a function.
27pub fn make_span_fn<R, F>(f: F) -> FnWrapper<F>
28where
29    F: Fn(&R) -> Span,
30{
31    FnWrapper(f)
32}
33
34/// A macro to implement [`MakeSpan`] for a tuple of types, where the first type
35/// implements [`MakeSpan`] and the rest implement [`EnrichSpan`].
36macro_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);