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