1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 19:47:45 +00:00

tee: remove unnecessary memory indirection

This removes two layers of Box<NamedWriter<...>>.
The indirection appears to be unintentional, and makes it harder to
understand and change the code.
This commit is contained in:
Ben Wiederhake 2024-03-31 16:47:35 +02:00
parent 0ef06bd82d
commit 5c36ed92b8

View file

@ -150,12 +150,7 @@ fn tee(options: &Options) -> Result<()> {
.files
.clone()
.into_iter()
.map(|file| {
Ok(NamedWriter {
name: file.clone(),
inner: open(file, options.append, options.output_error.as_ref())?,
})
})
.map(|file| open(file, options.append, options.output_error.as_ref()))
.collect::<Result<Vec<NamedWriter>>>()?;
writers.insert(
@ -188,13 +183,8 @@ fn tee(options: &Options) -> Result<()> {
}
}
fn open(
name: String,
append: bool,
output_error: Option<&OutputErrorMode>,
) -> Result<Box<dyn Write>> {
fn open(name: String, append: bool, output_error: Option<&OutputErrorMode>) -> Result<NamedWriter> {
let path = PathBuf::from(name.clone());
let inner: Box<dyn Write> = {
let mut options = OpenOptions::new();
let mode = if append {
options.append(true)
@ -202,17 +192,21 @@ fn open(
options.truncate(true)
};
match mode.write(true).create(true).open(path.as_path()) {
Ok(file) => Box::new(file),
Ok(file) => Ok(NamedWriter {
inner: Box::new(file),
name,
}),
Err(f) => {
show_error!("{}: {}", name.maybe_quote(), f);
match output_error {
Some(OutputErrorMode::Exit | OutputErrorMode::ExitNoPipe) => return Err(f),
_ => Box::new(sink()),
Some(OutputErrorMode::Exit | OutputErrorMode::ExitNoPipe) => Err(f),
_ => Ok(NamedWriter {
inner: Box::new(sink()),
name,
}),
}
}
}
};
Ok(Box::new(NamedWriter { inner, name }) as Box<dyn Write>)
}
struct MultiWriter {