@@ -236,24 +236,33 @@ fn process_error(
236236 }
237237}
238238
239- impl Write for MultiWriter {
240- fn write ( & mut self , buf : & [ u8 ] ) -> Result < usize > {
239+ impl MultiWriter {
240+ fn retain_with < F > ( & mut self , mut f : F ) -> Result < ( ) >
241+ where
242+ F : FnMut ( & mut NamedWriter ) -> Result < ( ) > ,
243+ {
241244 let mut aborted = None ;
242245 let mode = self . output_error_mode . clone ( ) ;
243246 let mut errors = 0 ;
244- self . writers . retain_mut ( |writer| {
245- writer
246- . write_all ( buf )
247- . map_err ( |f| {
248- let _ = process_error ( mode . as_ref ( ) , f , writer , & mut errors )
249- . map_err ( |e| aborted . get_or_insert ( e ) ) ;
250- } )
251- . is_ok ( )
247+ self . writers . retain_mut ( |writer| match f ( writer ) {
248+ Ok ( ( ) ) => true ,
249+ Err ( f ) => {
250+ if let Err ( e ) = process_error ( mode . as_ref ( ) , f , writer , & mut errors ) {
251+ aborted . get_or_insert ( e ) ;
252+ }
253+ false
254+ }
252255 } ) ;
253256 self . ignored_errors += errors;
254- if let Some ( e) = aborted {
255- Err ( e)
256- } else if self . writers . is_empty ( ) {
257+ aborted. map_or ( Ok ( ( ) ) , Err )
258+ }
259+ }
260+
261+ impl Write for MultiWriter {
262+ fn write ( & mut self , buf : & [ u8 ] ) -> Result < usize > {
263+ self . retain_with ( |w| w. write_all ( buf) ) ?;
264+
265+ if self . writers . is_empty ( ) {
257266 // This error kind will never be raised by the standard
258267 // library, so we can use it for early termination of
259268 // `copy`
@@ -264,24 +273,7 @@ impl Write for MultiWriter {
264273 }
265274
266275 fn flush ( & mut self ) -> Result < ( ) > {
267- let mut aborted = None ;
268- let mode = self . output_error_mode . clone ( ) ;
269- let mut errors = 0 ;
270- self . writers . retain_mut ( |writer| {
271- writer
272- . flush ( )
273- . map_err ( |f| {
274- let _ = process_error ( mode. as_ref ( ) , f, writer, & mut errors)
275- . map_err ( |e| aborted. get_or_insert ( e) ) ;
276- } )
277- . is_ok ( )
278- } ) ;
279- self . ignored_errors += errors;
280- if let Some ( e) = aborted {
281- Err ( e)
282- } else {
283- Ok ( ( ) )
284- }
276+ self . retain_with ( |w| w. flush ( ) )
285277 }
286278}
287279
0 commit comments