From 94f6702ba52a875d251e869eba55583e61da9ad1 Mon Sep 17 00:00:00 2001 From: cswn Date: Wed, 15 Nov 2023 13:20:22 +0100 Subject: [PATCH 1/4] join: remove crash! macro --- src/uu/join/src/join.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/uu/join/src/join.rs b/src/uu/join/src/join.rs index a48ba3657..3f2172da3 100644 --- a/src/uu/join/src/join.rs +++ b/src/uu/join/src/join.rs @@ -21,7 +21,7 @@ use std::os::unix::ffi::OsStrExt; use uucore::display::Quotable; use uucore::error::{set_exit_code, UError, UResult, USimpleError}; use uucore::line_ending::LineEnding; -use uucore::{crash, crash_if_err, format_usage, help_about, help_usage}; +use uucore::{crash_if_err, format_usage, help_about, help_usage}; const ABOUT: &str = help_about!("join.md"); const USAGE: &str = help_usage!("join.md"); @@ -334,17 +334,23 @@ impl<'a> State<'a> { key: usize, line_ending: LineEnding, print_unpaired: bool, - ) -> State<'a> { + ) -> Result, JoinError> { let f = if name == "-" { Box::new(stdin.lock()) as Box } else { match File::open(name) { Ok(file) => Box::new(BufReader::new(file)) as Box, - Err(err) => crash!(1, "{}: {}", name.maybe_quote(), err), + Err(err) => { + return Err(JoinError::UnorderedInput(format!( + "{}: {}", + name.maybe_quote(), + err + ))); + } } }; - State { + Ok(State { key, file_name: name, file_num, @@ -355,7 +361,7 @@ impl<'a> State<'a> { line_num: 0, has_failed: false, has_unpaired: false, - } + }) } /// Skip the current unpaired line. @@ -847,7 +853,7 @@ fn exec(file1: &str, file2: &str, settings: Settings) -> Result<(), JoinError> { settings.key1, settings.line_ending, settings.print_unpaired1, - ); + )?; let mut state2 = State::new( FileNum::File2, @@ -856,7 +862,7 @@ fn exec(file1: &str, file2: &str, settings: Settings) -> Result<(), JoinError> { settings.key2, settings.line_ending, settings.print_unpaired2, - ); + )?; let input = Input::new( settings.separator, From 5dff5f2f736c44c576adce2dbcbe8275d52ebbd2 Mon Sep 17 00:00:00 2001 From: cswn Date: Wed, 15 Nov 2023 13:52:01 +0100 Subject: [PATCH 2/4] join: rename f variable to file_buf --- src/uu/join/src/join.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/uu/join/src/join.rs b/src/uu/join/src/join.rs index 3f2172da3..c8008c91c 100644 --- a/src/uu/join/src/join.rs +++ b/src/uu/join/src/join.rs @@ -335,7 +335,7 @@ impl<'a> State<'a> { line_ending: LineEnding, print_unpaired: bool, ) -> Result, JoinError> { - let f = if name == "-" { + let file_buf = if name == "-" { Box::new(stdin.lock()) as Box } else { match File::open(name) { @@ -355,7 +355,7 @@ impl<'a> State<'a> { file_name: name, file_num, print_unpaired, - lines: f.split(line_ending as u8), + lines: file_buf.split(line_ending as u8), max_len: 1, seq: Vec::new(), line_num: 0, From a064c886566f810c3e58b1b1153762e772e35567 Mon Sep 17 00:00:00 2001 From: cswn Date: Thu, 16 Nov 2023 09:35:32 +0100 Subject: [PATCH 3/4] join: replace match with JoinError with map_err_context --- src/uu/join/src/join.rs | 34 ++++++++-------------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/src/uu/join/src/join.rs b/src/uu/join/src/join.rs index c8008c91c..966113887 100644 --- a/src/uu/join/src/join.rs +++ b/src/uu/join/src/join.rs @@ -19,7 +19,7 @@ use std::num::IntErrorKind; #[cfg(unix)] use std::os::unix::ffi::OsStrExt; use uucore::display::Quotable; -use uucore::error::{set_exit_code, UError, UResult, USimpleError}; +use uucore::error::{set_exit_code, FromIo, UError, UResult, USimpleError}; use uucore::line_ending::LineEnding; use uucore::{crash_if_err, format_usage, help_about, help_usage}; @@ -334,20 +334,12 @@ impl<'a> State<'a> { key: usize, line_ending: LineEnding, print_unpaired: bool, - ) -> Result, JoinError> { + ) -> UResult> { let file_buf = if name == "-" { Box::new(stdin.lock()) as Box } else { - match File::open(name) { - Ok(file) => Box::new(BufReader::new(file)) as Box, - Err(err) => { - return Err(JoinError::UnorderedInput(format!( - "{}: {}", - name.maybe_quote(), - err - ))); - } - } + let file = File::open(name).map_err_context(|| format!("{}", name.maybe_quote()))?; + Box::new(BufReader::new(file)) as Box }; Ok(State { @@ -365,12 +357,7 @@ impl<'a> State<'a> { } /// Skip the current unpaired line. - fn skip_line( - &mut self, - writer: &mut impl Write, - input: &Input, - repr: &Repr, - ) -> Result<(), JoinError> { + fn skip_line(&mut self, writer: &mut impl Write, input: &Input, repr: &Repr) -> UResult<()> { if self.print_unpaired { self.print_first_line(writer, repr)?; } @@ -381,7 +368,7 @@ impl<'a> State<'a> { /// Keep reading line sequence until the key does not change, return /// the first line whose key differs. - fn extend(&mut self, input: &Input) -> Result, JoinError> { + fn extend(&mut self, input: &Input) -> UResult> { while let Some(line) = self.next_line(input)? { let diff = input.compare(self.get_current_key(), line.get_field(self.key)); @@ -490,12 +477,7 @@ impl<'a> State<'a> { 0 } - fn finalize( - &mut self, - writer: &mut impl Write, - input: &Input, - repr: &Repr, - ) -> Result<(), JoinError> { + fn finalize(&mut self, writer: &mut impl Write, input: &Input, repr: &Repr) -> UResult<()> { if self.has_line() { if self.print_unpaired { self.print_first_line(writer, repr)?; @@ -843,7 +825,7 @@ FILENUM is 1 or 2, corresponding to FILE1 or FILE2", ) } -fn exec(file1: &str, file2: &str, settings: Settings) -> Result<(), JoinError> { +fn exec(file1: &str, file2: &str, settings: Settings) -> UResult<()> { let stdin = stdin(); let mut state1 = State::new( From 65dc70b55396c3a00b70143fc84cc7d96cc25539 Mon Sep 17 00:00:00 2001 From: cswn Date: Thu, 16 Nov 2023 12:02:39 +0100 Subject: [PATCH 4/4] join: remove match in uumain and return exec result --- src/uu/join/src/join.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/uu/join/src/join.rs b/src/uu/join/src/join.rs index 966113887..423af983e 100644 --- a/src/uu/join/src/join.rs +++ b/src/uu/join/src/join.rs @@ -701,10 +701,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { return Err(USimpleError::new(1, "both files cannot be standard input")); } - match exec(file1, file2, settings) { - Ok(_) => Ok(()), - Err(e) => Err(USimpleError::new(1, format!("{e}"))), - } + exec(file1, file2, settings) } pub fn uu_app() -> Command {