1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
use core::fmt::Display; use super::source::{ErrorSource, StdError}; pub trait ErrorMessageTracer { fn new_message<E: Display>(message: &E) -> Self; fn add_message<E: Display>(self, message: &E) -> Self; #[cfg(feature = "std")] fn as_error(&self) -> Option<&(dyn std::error::Error + 'static)>; } pub trait ErrorTracer<E>: ErrorMessageTracer { fn new_trace(err: &E) -> Self; fn add_trace(self, err: &E) -> Self; } impl <E, Tracer> ErrorSource<Tracer> for StdError<E> where Tracer: ErrorTracer<E>, { type Detail = E; type Source = E; fn error_details(source: Self::Source) -> (Self::Detail, Option<Tracer>) { let trace = Tracer::new_trace(&source); (source, Some(trace)) } }