1use std::{backtrace::Backtrace, fmt::Display};
2
3use tracing_error::SpanTrace;
4
5pub trait CaptureTrace {
7 type Trace;
9 fn capture(&self) -> Self::Trace;
11}
12
13pub struct CaptureSpanTrace;
16
17impl CaptureTrace for CaptureSpanTrace {
18 type Trace = SpanTrace;
19
20 fn capture(&self) -> Self::Trace {
21 SpanTrace::capture()
22 }
23}
24
25pub struct CaptureSpanAndStackTrace;
30
31impl CaptureTrace for CaptureSpanAndStackTrace {
32 type Trace = StackAndSpanTrace;
33
34 fn capture(&self) -> Self::Trace {
35 StackAndSpanTrace::capture()
36 }
37}
38
39#[derive(Debug)]
40pub struct StackAndSpanTrace {
41 pub(crate) stack_trace: Backtrace,
42 pub(crate) span_trace: SpanTrace,
43}
44
45impl StackAndSpanTrace {
46 pub(crate) fn capture() -> Self {
47 Self {
48 span_trace: SpanTrace::capture(),
49 stack_trace: Backtrace::capture(),
50 }
51 }
52
53 pub fn stack_trace(&self) -> &Backtrace {
54 &self.stack_trace
55 }
56
57 pub fn span_trace(&self) -> &SpanTrace {
58 &self.span_trace
59 }
60}
61
62impl Display for StackAndSpanTrace {
63 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
64 write!(
65 f,
66 "span trace:\n{span_trace}\nstack trace:\n{stack_trace}",
67 span_trace = self.span_trace,
68 stack_trace = self.stack_trace,
69 )
70 }
71}