From 51dce9c5f8df412e94740411581d20101303645b Mon Sep 17 00:00:00 2001 From: Fuad Ismail Date: Thu, 12 Dec 2024 11:45:58 +0700 Subject: [PATCH] csplit: return UResult instead of io::Result from iterator to handle error message more uniformly. --- src/uu/csplit/src/csplit.rs | 18 +++++++++++------- src/uu/csplit/src/csplit_error.rs | 17 ++++++++++++++--- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/uu/csplit/src/csplit.rs b/src/uu/csplit/src/csplit.rs index a0bfc61cc..678d17094 100644 --- a/src/uu/csplit/src/csplit.rs +++ b/src/uu/csplit/src/csplit.rs @@ -87,7 +87,11 @@ pub fn csplit(options: &CsplitOptions, patterns: &[String], input: T) -> Resu where T: BufRead, { - let mut input_iter = InputSplitter::new(input.lines().enumerate()); + let enumerated_input_lines = input + .lines() + .map(|line| line.map_err_context(|| "read error".to_string())) + .enumerate(); + let mut input_iter = InputSplitter::new(enumerated_input_lines); let mut split_writer = SplitWriter::new(options); let patterns: Vec = patterns::get_patterns(patterns)?; let ret = do_csplit(&mut split_writer, patterns, &mut input_iter); @@ -117,7 +121,7 @@ fn do_csplit( input_iter: &mut InputSplitter, ) -> Result<(), CsplitError> where - I: Iterator)>, + I: Iterator)>, { // split the file based on patterns for pattern in patterns { @@ -305,7 +309,7 @@ impl SplitWriter<'_> { input_iter: &mut InputSplitter, ) -> Result<(), CsplitError> where - I: Iterator)>, + I: Iterator)>, { input_iter.rewind_buffer(); input_iter.set_size_of_buffer(1); @@ -358,7 +362,7 @@ impl SplitWriter<'_> { input_iter: &mut InputSplitter, ) -> Result<(), CsplitError> where - I: Iterator)>, + I: Iterator)>, { if offset >= 0 { // The offset is zero or positive, no need for a buffer on the lines read. @@ -470,7 +474,7 @@ impl SplitWriter<'_> { /// This is used to pass matching lines to the next split and to support patterns with a negative offset. struct InputSplitter where - I: Iterator)>, + I: Iterator)>, { iter: I, buffer: Vec<::Item>, @@ -483,7 +487,7 @@ where impl InputSplitter where - I: Iterator)>, + I: Iterator)>, { fn new(iter: I) -> Self { Self { @@ -547,7 +551,7 @@ where impl Iterator for InputSplitter where - I: Iterator)>, + I: Iterator)>, { type Item = ::Item; diff --git a/src/uu/csplit/src/csplit_error.rs b/src/uu/csplit/src/csplit_error.rs index 4a83b637b..ac1c8d01c 100644 --- a/src/uu/csplit/src/csplit_error.rs +++ b/src/uu/csplit/src/csplit_error.rs @@ -35,6 +35,8 @@ pub enum CsplitError { SuffixFormatTooManyPercents, #[error("{} is not a regular file", ._0.quote())] NotRegularFile(String), + #[error("{}", _0)] + UError(Box), } impl From for CsplitError { @@ -43,8 +45,17 @@ impl From for CsplitError { } } -impl UError for CsplitError { - fn code(&self) -> i32 { - 1 +impl From> for CsplitError { + fn from(error: Box) -> Self { + Self::UError(error) + } +} + +impl UError for CsplitError { + fn code(&self) -> i32 { + match self { + Self::UError(e) => e.code(), + _ => 1, + } } }