tracing_s3/layer/
with_event_from_span.rs

1/// Macro for creating synthetic events from span data.
2/// 
3/// This macro creates a new tracing event that appears to come from a specific span,
4/// allowing for rich span lifecycle logging with custom fields.
5/// 
6/// # Arguments
7/// * `$id` - The span ID
8/// * `$span` - The span reference
9/// * `$field:literal = $value:expr` - Field-value pairs to include in the event
10/// * `|$event| $code:block` - Closure that receives the created event
11/// 
12/// # Example
13/// ```rust
14/// with_event_from_span!(
15///     span_id, 
16///     span_ref, 
17///     "message" = "span_entered", 
18///     "duration" = elapsed_time,
19///     |event| {
20///         // Handle the synthetic event
21///         self.on_event(&event, ctx);
22///     }
23/// );
24/// ```
25#[macro_export]
26macro_rules! with_event_from_span {
27    ($id:ident, $span:ident, $($field:literal = $value:expr),*, |$event:ident| $code:block) => {
28        let meta = $span.metadata();
29        let cs = meta.callsite();
30        let fs = field::FieldSet::new(&[$($field),*], cs);
31        #[allow(unused)]
32        let mut iter = fs.iter();
33        let v = [$(
34            (&iter.next().unwrap(), ::core::option::Option::Some(&$value as &dyn field::Value)),
35        )*];
36        let vs = fs.value_set(&v);
37        let $event = Event::new_child_of($id, meta, &vs);
38        $code
39    };
40}