@@ -474,23 +474,47 @@ impl snafu::ErrorCompat for Error {
474
474
}
475
475
}
476
476
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
+
477
491
impl core:: fmt:: Display for Error {
478
492
fn fmt ( & self , f : & mut core:: fmt:: Formatter ) -> core:: fmt:: Result {
479
493
match self {
480
494
Self :: Source { source, .. } => {
481
- write ! ( f, "{}" , source)
495
+ write ! ( f, "{}" , source) ?;
496
+ write_sources_if_alternate ( f, source. source ( ) ) ?;
497
+ Ok ( ( ) )
482
498
}
483
499
Self :: Whatever {
484
500
message, source, ..
485
501
} => match ( source, message) {
486
502
( 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
+ }
488
508
}
489
509
( None , Some ( message) ) => {
490
510
write ! ( f, "{}" , message)
491
511
}
492
512
( Some ( source) , None ) => {
493
- write ! ( f, "{}" , source)
513
+ if f. alternate ( ) {
514
+ write ! ( f, "{:#}" , source)
515
+ } else {
516
+ write ! ( f, "{}" , source)
517
+ }
494
518
}
495
519
( None , None ) => {
496
520
write ! ( f, "Error" )
@@ -500,10 +524,12 @@ impl core::fmt::Display for Error {
500
524
message, source, ..
501
525
} => {
502
526
if let Some ( message) = message {
503
- write ! ( f, "{}: {}" , message, source)
527
+ write ! ( f, "{}: {}" , message, source) ? ;
504
528
} else {
505
- write ! ( f, "{}" , source)
529
+ write ! ( f, "{}" , source) ? ;
506
530
}
531
+ write_sources_if_alternate ( f, source. source ( ) ) ?;
532
+ Ok ( ( ) )
507
533
}
508
534
Self :: Anyhow { source, .. } => source. fmt ( f) ,
509
535
}
0 commit comments