Skip to content

Commit d4c0f0b

Browse files
committed
csplit: return UResult instead of io::Result from iterator to handle error message more uniformly.
1 parent 1fc9169 commit d4c0f0b

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

src/uu/csplit/src/csplit.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,11 @@ pub fn csplit<T>(options: &CsplitOptions, patterns: &[String], input: T) -> Resu
9090
where
9191
T: BufRead,
9292
{
93-
let mut input_iter = InputSplitter::new(input.lines().enumerate());
93+
let enumerated_input_lines = input
94+
.lines()
95+
.enumerate()
96+
.map(|(idx, result)| (idx, result.map_err_context(|| "read error".to_string())));
97+
let mut input_iter = InputSplitter::new(enumerated_input_lines);
9498
let mut split_writer = SplitWriter::new(options);
9599
let patterns: Vec<patterns::Pattern> = patterns::get_patterns(patterns)?;
96100
let ret = do_csplit(&mut split_writer, patterns, &mut input_iter);
@@ -120,7 +124,7 @@ fn do_csplit<I>(
120124
input_iter: &mut InputSplitter<I>,
121125
) -> Result<(), CsplitError>
122126
where
123-
I: Iterator<Item = (usize, io::Result<String>)>,
127+
I: Iterator<Item = (usize, UResult<String>)>,
124128
{
125129
// split the file based on patterns
126130
for pattern in patterns {
@@ -308,7 +312,7 @@ impl SplitWriter<'_> {
308312
input_iter: &mut InputSplitter<I>,
309313
) -> Result<(), CsplitError>
310314
where
311-
I: Iterator<Item = (usize, io::Result<String>)>,
315+
I: Iterator<Item = (usize, UResult<String>)>,
312316
{
313317
input_iter.rewind_buffer();
314318
input_iter.set_size_of_buffer(1);
@@ -361,7 +365,7 @@ impl SplitWriter<'_> {
361365
input_iter: &mut InputSplitter<I>,
362366
) -> Result<(), CsplitError>
363367
where
364-
I: Iterator<Item = (usize, io::Result<String>)>,
368+
I: Iterator<Item = (usize, UResult<String>)>,
365369
{
366370
if offset >= 0 {
367371
// The offset is zero or positive, no need for a buffer on the lines read.
@@ -456,7 +460,7 @@ impl SplitWriter<'_> {
456460
/// This is used to pass matching lines to the next split and to support patterns with a negative offset.
457461
struct InputSplitter<I>
458462
where
459-
I: Iterator<Item = (usize, io::Result<String>)>,
463+
I: Iterator<Item = (usize, UResult<String>)>,
460464
{
461465
iter: I,
462466
buffer: Vec<<I as Iterator>::Item>,
@@ -469,7 +473,7 @@ where
469473

470474
impl<I> InputSplitter<I>
471475
where
472-
I: Iterator<Item = (usize, io::Result<String>)>,
476+
I: Iterator<Item = (usize, UResult<String>)>,
473477
{
474478
fn new(iter: I) -> Self {
475479
Self {
@@ -533,7 +537,7 @@ where
533537

534538
impl<I> Iterator for InputSplitter<I>
535539
where
536-
I: Iterator<Item = (usize, io::Result<String>)>,
540+
I: Iterator<Item = (usize, UResult<String>)>,
537541
{
538542
type Item = <I as Iterator>::Item;
539543

src/uu/csplit/src/csplit_error.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ pub enum CsplitError {
3535
SuffixFormatTooManyPercents,
3636
#[error("{} is not a regular file", ._0.quote())]
3737
NotRegularFile(String),
38+
#[error("{}", _0)]
39+
UError(Box<dyn UError>),
3840
}
3941

4042
impl From<io::Error> for CsplitError {
@@ -43,8 +45,17 @@ impl From<io::Error> for CsplitError {
4345
}
4446
}
4547

48+
impl From<Box<dyn UError>> for CsplitError {
49+
fn from(error: Box<dyn UError>) -> Self {
50+
Self::UError(error)
51+
}
52+
}
53+
4654
impl UError for CsplitError {
4755
fn code(&self) -> i32 {
48-
1
56+
match self {
57+
Self::UError(e) => e.code(),
58+
_ => 1,
59+
}
4960
}
5061
}

0 commit comments

Comments
 (0)