#[cfg(feature = "spantrace")]
use tracing_error::SpanTrace;
#[cfg(feature = "spantrace")]
use tracing_error::SpanTraceStatus;
use crate::annotation::Annotation;
use crate::backtrace::Backtrace;
use crate::erased::ErasedReport;
use crate::location::SourceLocation;
use crate::value::Field;
#[derive(Debug)]
pub struct Context {
pub(crate) annotations: Vec<Annotation>,
pub(crate) fields: Vec<Field>,
pub(crate) location: SourceLocation,
pub(crate) backtrace: Backtrace,
#[cfg(feature = "spantrace")]
pub(crate) spantrace: SpanTrace,
pub(crate) cause: Option<ErasedReport>,
pub(crate) factors: Vec<ErasedReport>,
}
impl Context {
#[track_caller]
pub(crate) fn capture() -> Self {
Self {
annotations: Vec::new(),
fields: Vec::new(),
location: SourceLocation::caller(),
backtrace: Backtrace::capture(),
#[cfg(feature = "spantrace")]
spantrace: SpanTrace::capture(),
cause: None,
factors: Vec::new(),
}
}
#[must_use]
pub fn annotations(&self) -> &[Annotation] {
&self.annotations
}
#[must_use]
pub fn fields(&self) -> &[Field] {
&self.fields
}
#[must_use]
pub fn location(&self) -> &SourceLocation {
&self.location
}
#[must_use]
pub fn backtrace(&self) -> &Backtrace {
&self.backtrace
}
#[must_use]
pub fn has_backtrace(&self) -> bool {
self.backtrace.is_captured()
}
#[cfg(feature = "spantrace")]
#[must_use]
pub fn spantrace(&self) -> &SpanTrace {
&self.spantrace
}
#[cfg(feature = "spantrace")]
#[must_use]
pub fn has_spantrace(&self) -> bool {
self.spantrace.status() == SpanTraceStatus::CAPTURED
}
#[must_use]
pub fn cause(&self) -> Option<&ErasedReport> {
self.cause.as_ref()
}
#[must_use]
pub fn factors(&self) -> &[ErasedReport] {
&self.factors
}
}