@@ -222,24 +222,33 @@ fn process_error(
222222 }
223223}
224224
225- impl Write for MultiWriter {
226- fn write ( & mut self , buf : & [ u8 ] ) -> Result < usize > {
225+ impl MultiWriter {
226+ fn retain_with < F > ( & mut self , mut f : F ) -> Result < ( ) >
227+ where
228+ F : FnMut ( & mut NamedWriter ) -> Result < ( ) > ,
229+ {
227230 let mut aborted = None ;
228231 let mode = self . output_error_mode . clone ( ) ;
229232 let mut errors = 0 ;
230- self . writers . retain_mut ( |writer| {
231- writer
232- . write_all ( buf )
233- . map_err ( |f| {
234- let _ = process_error ( mode . as_ref ( ) , f , writer , & mut errors )
235- . map_err ( |e| aborted . get_or_insert ( e ) ) ;
236- } )
237- . is_ok ( )
233+ self . writers . retain_mut ( |writer| match f ( writer ) {
234+ Ok ( ( ) ) => true ,
235+ Err ( f ) => {
236+ if let Err ( e ) = process_error ( mode . as_ref ( ) , f , writer , & mut errors ) {
237+ aborted . get_or_insert ( e ) ;
238+ }
239+ false
240+ }
238241 } ) ;
239242 self . ignored_errors += errors;
240- if let Some ( e) = aborted {
241- Err ( e)
242- } else if self . writers . is_empty ( ) {
243+ aborted. map_or ( Ok ( ( ) ) , Err )
244+ }
245+ }
246+
247+ impl Write for MultiWriter {
248+ fn write ( & mut self , buf : & [ u8 ] ) -> Result < usize > {
249+ self . retain_with ( |w| w. write_all ( buf) ) ?;
250+
251+ if self . writers . is_empty ( ) {
243252 // This error kind will never be raised by the standard
244253 // library, so we can use it for early termination of
245254 // `copy`
@@ -250,20 +259,7 @@ impl Write for MultiWriter {
250259 }
251260
252261 fn flush ( & mut self ) -> Result < ( ) > {
253- let mut aborted = None ;
254- let mode = self . output_error_mode . clone ( ) ;
255- let mut errors = 0 ;
256- self . writers . retain_mut ( |writer| {
257- writer
258- . flush ( )
259- . map_err ( |f| {
260- let _ = process_error ( mode. as_ref ( ) , f, writer, & mut errors)
261- . map_err ( |e| aborted. get_or_insert ( e) ) ;
262- } )
263- . is_ok ( )
264- } ) ;
265- self . ignored_errors += errors;
266- aborted. map_or ( Ok ( ( ) ) , Err )
262+ self . retain_with ( Write :: flush)
267263 }
268264}
269265
0 commit comments