Skip to content

Commit db17612

Browse files
committed
refactor(tee): introduce retain_with method for MultiWriter
1 parent 5338401 commit db17612

File tree

1 file changed

+23
-27
lines changed

1 file changed

+23
-27
lines changed

src/uu/tee/src/tee.rs

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)