Skip to content

Commit a053414

Browse files
committed
feat: print sources on alternate display
1 parent 163b4e4 commit a053414

File tree

1 file changed

+31
-5
lines changed

1 file changed

+31
-5
lines changed

src/error.rs

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -474,23 +474,47 @@ impl snafu::ErrorCompat for Error {
474474
}
475475
}
476476

477+
fn write_sources_if_alternate(
478+
f: &mut core::fmt::Formatter,
479+
mut source: Option<&dyn std::error::Error>,
480+
) -> core::fmt::Result {
481+
if !f.alternate() {
482+
return Ok(());
483+
}
484+
while let Some(inner) = source {
485+
write!(f, ": {}", inner)?;
486+
source = inner.source();
487+
}
488+
Ok(())
489+
}
490+
477491
impl core::fmt::Display for Error {
478492
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
479493
match self {
480494
Self::Source { source, .. } => {
481-
write!(f, "{}", source)
495+
write!(f, "{}", source)?;
496+
write_sources_if_alternate(f, source.source())?;
497+
Ok(())
482498
}
483499
Self::Whatever {
484500
message, source, ..
485501
} => match (source, message) {
486502
(Some(source), Some(message)) => {
487-
write!(f, "{}: {}", message, source)
503+
if f.alternate() {
504+
write!(f, "{}: {:#}", message, source)
505+
} else {
506+
write!(f, "{}: {}", message, source)
507+
}
488508
}
489509
(None, Some(message)) => {
490510
write!(f, "{}", message)
491511
}
492512
(Some(source), None) => {
493-
write!(f, "{}", source)
513+
if f.alternate() {
514+
write!(f, "{:#}", source)
515+
} else {
516+
write!(f, "{}", source)
517+
}
494518
}
495519
(None, None) => {
496520
write!(f, "Error")
@@ -500,10 +524,12 @@ impl core::fmt::Display for Error {
500524
message, source, ..
501525
} => {
502526
if let Some(message) = message {
503-
write!(f, "{}: {}", message, source)
527+
write!(f, "{}: {}", message, source)?;
504528
} else {
505-
write!(f, "{}", source)
529+
write!(f, "{}", source)?;
506530
}
531+
write_sources_if_alternate(f, source.source())?;
532+
Ok(())
507533
}
508534
Self::Anyhow { source, .. } => source.fmt(f),
509535
}

0 commit comments

Comments
 (0)