1use std::{backtrace::Backtrace, fmt::Display};
2
3use tracing_error::SpanTrace;
4
5pub trait CaptureTrace {
6 type Trace;
7 fn capture(&self) -> Self::Trace;
8}
9
10pub struct DefaultTraceCapturer;
11
12impl CaptureTrace for DefaultTraceCapturer {
13 type Trace = StackAndSpanTrace;
14
15 fn capture(&self) -> Self::Trace {
16 StackAndSpanTrace::capture()
17 }
18}
19
20#[derive(Debug)]
21pub struct StackAndSpanTrace {
22 pub(crate) stack_trace: Backtrace,
23 pub(crate) span_trace: SpanTrace,
24}
25
26impl StackAndSpanTrace {
27 pub(crate) fn capture() -> Self {
28 Self {
29 span_trace: SpanTrace::capture(),
30 stack_trace: Backtrace::capture(),
31 }
32 }
33
34 pub fn stack_trace(&self) -> &Backtrace {
35 &self.stack_trace
36 }
37
38 pub fn span_trace(&self) -> &SpanTrace {
39 &self.span_trace
40 }
41}
42
43impl Display for StackAndSpanTrace {
44 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45 write!(
46 f,
47 "{span_trace}\n{stack_trace}",
48 span_trace = self.span_trace,
49 stack_trace = self.stack_trace,
50 )
51 }
52}