Skip to content

Commit 66f86da

Browse files
committed
refactor(tee): introduce retain_with method for MultiWriter
1 parent 26223ad commit 66f86da

File tree

1 file changed

+23
-31
lines changed

1 file changed

+23
-31
lines changed

src/uu/tee/src/tee.rs

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

Comments
 (0)