#[macro_use]
#[path = "report/macros.rs"]
mod macros;
#[path = "report/accessors.rs"]
mod accessors;
#[path = "report/builder.rs"]
mod builder;
#[path = "report/ext.rs"]
mod ext;
#[path = "report/global.rs"]
mod global;
#[path = "report/impls.rs"]
mod impls;
#[cfg(feature = "trace")]
#[path = "report/trace.rs"]
mod trace;
#[path = "report/transform.rs"]
mod transform;
#[path = "report/types.rs"]
mod types;
use alloc::boxed::Box;
use core::error::Error;
pub use ext::{Diagnostic, InspectReportExt, ResultReportExt};
pub use types::{
Attachment, AttachmentValue, CauseCollectOptions, CauseKind, ContextMap, ContextValue,
DiagnosticBag, DisplayCauseChain, ErrorCode, ErrorCodeIntError, GlobalErrorMeta, HasSeverity,
MissingSeverity, ReportMetadata, ReportOptions, Severity, SeverityParseError, SeverityState,
SourceErrorChain, SourceErrorEntry, SourceErrorItem, StackFrame, StackTrace, StackTraceFormat,
};
pub use types::{AttachmentVisit, CauseTraversalState, GlobalContext, ReportSourceErrorIter};
#[cfg(feature = "json")]
pub use types::{JsonContext, JsonContextEntry};
#[cfg(feature = "std")]
pub use global::RegisterGlobalContextError;
#[cfg(feature = "std")]
pub use global::register_global_injector;
#[cfg(feature = "trace")]
pub use trace::{ReportTrace, TraceContext, TraceEvent, TraceEventAttribute, TraceEventLevel};
#[cfg(feature = "std")]
pub use types::{GlobalConfig, SetGlobalConfigError, set_global_config};
pub(crate) use types::{append_source_chain, limit_depth_source_chain};
pub struct Report<E, State: SeverityState = MissingSeverity> {
inner: E,
data: Box<ReportData<State>>,
}
struct ReportData<State: SeverityState> {
metadata: ReportMetadata<State>,
options: ReportOptions,
#[cfg(feature = "trace")]
trace: ReportTrace,
bag: DiagnosticBag,
}
impl<E, State> Report<E, State>
where
State: SeverityState,
{
pub(crate) fn diagnostics(&self) -> &DiagnosticBag {
&self.data.bag
}
pub(crate) fn diagnostics_mut(&mut self) -> &mut DiagnosticBag {
&mut self.data.bag
}
fn metadata_ref(&self) -> &ReportMetadata<State> {
&self.data.metadata
}
}
impl<E, State> Report<E, State>
where
E: Error,
State: SeverityState,
{
fn source_errors_view(
&self,
stored: Option<&SourceErrorChain>,
include_inner_source: bool,
options: CauseCollectOptions,
) -> Option<SourceErrorChain> {
let mut snapshot = stored.cloned();
if include_inner_source && let Some(source) = self.inner.source() {
let source_chain = SourceErrorChain::from_source(source, options);
match snapshot.as_mut() {
Some(existing) => append_source_chain(existing, source_chain),
None => snapshot = Some(source_chain),
}
}
let mut snapshot = snapshot?;
limit_depth_source_chain(&mut snapshot, options, 0);
if !options.detect_cycle {
snapshot.clear_cycle_flags();
}
Some(snapshot)
}
pub(crate) fn origin_src_err_view(
&self,
options: CauseCollectOptions,
) -> Option<SourceErrorChain> {
let bag: &DiagnosticBag = Report::<E, State>::diagnostics(self);
Report::<E, State>::source_errors_view(self, bag.origin_src_errors(), true, options)
}
pub(crate) fn diag_src_err_view(
&self,
options: CauseCollectOptions,
) -> Option<SourceErrorChain> {
let bag: &DiagnosticBag = Report::<E, State>::diagnostics(self);
Report::<E, State>::source_errors_view(self, bag.diag_src_errors(), false, options)
}
}
impl<E, State> Report<E, State>
where
State: SeverityState,
{
pub fn set_severity(self, severity: Severity) -> Report<E, HasSeverity> {
let Self { inner, data } = self;
let ReportData {
metadata,
options,
#[cfg(feature = "trace")]
trace,
bag,
} = *data;
Report {
inner,
data: Box::new(ReportData {
metadata: metadata.into_has_severity(severity),
options,
#[cfg(feature = "trace")]
trace,
bag,
}),
}
}
pub fn with_severity(self, severity: Severity) -> Report<E, HasSeverity> {
if let Some(existing) = self.severity() {
let Self { inner, data } = self;
let ReportData {
metadata,
options,
#[cfg(feature = "trace")]
trace,
bag,
} = *data;
Report {
inner,
data: Box::new(ReportData {
metadata: metadata.into_has_severity(existing),
options,
#[cfg(feature = "trace")]
trace,
bag,
}),
}
} else {
self.set_severity(severity)
}
}
}