140
140
//! [Cargo Contributor Guide]: https://doc.crates.io/contrib/
141
141
142
142
use crate :: core:: Shell ;
143
+ use crate :: core:: shell:: Verbosity ;
143
144
use crate :: core:: shell:: Verbosity :: Verbose ;
144
145
use anyhow:: Error ;
145
146
use tracing:: debug;
@@ -206,18 +207,21 @@ pub fn display_warning_with_error(warning: &str, err: &Error, shell: &mut Shell)
206
207
_display_error ( err, shell, false ) ;
207
208
}
208
209
209
- fn _display_error ( err : & Error , shell : & mut Shell , as_err : bool ) -> bool {
210
- for ( i, err) in err. chain ( ) . enumerate ( ) {
211
- // If we're not in verbose mode then only print cause chain until one
212
- // marked as `VerboseError` appears.
213
- //
214
- // Generally the top error shouldn't be verbose, but check it anyways.
215
- if shell. verbosity ( ) != Verbose && err. is :: < VerboseError > ( ) {
216
- return true ;
217
- }
218
- if err. is :: < AlreadyPrintedError > ( ) {
219
- break ;
220
- }
210
+ fn error_chain ( err : & Error , verbosity : Verbosity ) -> impl Iterator < Item = & dyn std:: fmt:: Display > {
211
+ err. chain ( )
212
+ . take_while ( move |err| {
213
+ // If we're not in verbose mode then only print cause chain until one
214
+ // marked as `VerboseError` appears.
215
+ //
216
+ // Generally the top error shouldn't be verbose, but check it anyways.
217
+ verbosity == Verbose || !err. is :: < VerboseError > ( )
218
+ } )
219
+ . take_while ( |err| !err. is :: < AlreadyPrintedError > ( ) )
220
+ . map ( |err| err as & dyn std:: fmt:: Display )
221
+ }
222
+
223
+ fn _display_error ( err : & Error , shell : & mut Shell , as_err : bool ) {
224
+ for ( i, err) in error_chain ( err, shell. verbosity ( ) ) . enumerate ( ) {
221
225
if i == 0 {
222
226
if as_err {
223
227
drop ( shell. error ( & err) ) ;
@@ -229,5 +233,4 @@ fn _display_error(err: &Error, shell: &mut Shell, as_err: bool) -> bool {
229
233
drop ( write ! ( shell. err( ) , "{}" , indented_lines( & err. to_string( ) ) ) ) ;
230
234
}
231
235
}
232
- false
233
236
}
0 commit comments