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))
  }
}