* I thought to do something like this: ``` #[derive(Debug)] enum BusPinErrorKind { SetLow(ErrorKind), SetHigh(ErrorKind), IsHigh(ErrorKind), } impl fmt::Display for BusPinErrorKind { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::SetLow(_) => write!(f, "could not set pin low"), Self::SetHigh(_) => write!(f, "could not set pin high"), Self::IsHigh(_) => write!(f, "could not read pin"), } } } impl Error for BusPinErrorKind { fn source(&self) -> Option<&(dyn Error + 'static)> { match &self { Self::SetLow(error) => Some(error), Self::SetHigh(error) => Some(error), Self::IsHigh(error) => Some(error), } } } ``` And then if the set_high() returns an error variant I store that ErrorKind in my Error and then create a stack trace to the top.