A single-line error is often useless on its own. "could not load config" tells an operator nothing they did not already know.
Error::source is the standard way to attach the reason:
impl Error for LoadFailed {
fn source(&self) -> Option<&(dyn Error + 'static)> {
Some(&self.cause)
}
}
Each layer adds what it was trying to do and keeps the layer below intact. Walking the chain then produces the whole story, from the intent down to the syscall.
