From a26fbe7c8e36b4e5cf2268e1a4711527b4c9732e Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sat, 25 Dec 2021 20:18:27 -0500 Subject: [PATCH 1/2] csplit: return UResult from uumain() function --- src/uu/csplit/src/csplit.rs | 37 +++++++++++++++++++++---------- src/uu/csplit/src/csplit_error.rs | 9 ++++++++ 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/uu/csplit/src/csplit.rs b/src/uu/csplit/src/csplit.rs index 0d99154df..b2e6914b2 100644 --- a/src/uu/csplit/src/csplit.rs +++ b/src/uu/csplit/src/csplit.rs @@ -2,15 +2,19 @@ #[macro_use] extern crate uucore; -use clap::{crate_version, App, Arg, ArgMatches}; -use regex::Regex; + use std::cmp::Ordering; use std::io::{self, BufReader}; use std::{ fs::{remove_file, File}, io::{BufRead, BufWriter, Write}, }; + +use clap::{crate_version, App, Arg, ArgMatches}; +use regex::Regex; use uucore::display::Quotable; +use uucore::error::{FromIo, UError, UResult}; +use uucore::InvalidEncodingHandling; mod csplit_error; mod patterns; @@ -18,7 +22,6 @@ mod split_name; use crate::csplit_error::CsplitError; use crate::split_name::SplitName; -use uucore::InvalidEncodingHandling; static SUMMARY: &str = "split a file into sections determined by context lines"; static LONG_HELP: &str = "Output pieces of FILE separated by PATTERN(s) to files 'xx00', 'xx01', ..., and output byte counts of each piece to standard output."; @@ -712,7 +715,15 @@ mod tests { } } -pub fn uumain(args: impl uucore::Args) -> i32 { +fn to_box(e: E) -> Box +where + E: UError + 'static, +{ + Box::new(e) +} + +#[uucore_procs::gen_uumain] +pub fn uumain(args: impl uucore::Args) -> UResult<()> { let usage = usage(); let args = args .collect_str(InvalidEncodingHandling::Ignore) @@ -729,20 +740,22 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .unwrap() .map(str::to_string) .collect(); - let patterns = crash_if_err!(1, patterns::get_patterns(&patterns[..])); + let patterns = patterns::get_patterns(&patterns[..])?; let options = CsplitOptions::new(&matches); if file_name == "-" { let stdin = io::stdin(); - crash_if_err!(1, csplit(&options, patterns, stdin.lock())); + csplit(&options, patterns, stdin.lock()).map_err(to_box) } else { - let file = crash_if_err!(1, File::open(file_name)); - let file_metadata = crash_if_err!(1, file.metadata()); + let file = File::open(file_name) + .map_err_context(|| format!("cannot access {}", file_name.quote()))?; + let file_metadata = file + .metadata() + .map_err_context(|| format!("cannot access {}", file_name.quote()))?; if !file_metadata.is_file() { - crash!(1, "{} is not a regular file", file_name.quote()); + return Err(CsplitError::NotRegularFile(file_name.to_string()).into()); } - crash_if_err!(1, csplit(&options, patterns, BufReader::new(file))); - }; - 0 + csplit(&options, patterns, BufReader::new(file)).map_err(to_box) + } } pub fn uu_app() -> App<'static, 'static> { diff --git a/src/uu/csplit/src/csplit_error.rs b/src/uu/csplit/src/csplit_error.rs index 1d4823ee2..53d48a026 100644 --- a/src/uu/csplit/src/csplit_error.rs +++ b/src/uu/csplit/src/csplit_error.rs @@ -2,6 +2,7 @@ use std::io; use thiserror::Error; use uucore::display::Quotable; +use uucore::error::UError; /// Errors thrown by the csplit command #[derive(Debug, Error)] @@ -28,6 +29,8 @@ pub enum CsplitError { SuffixFormatIncorrect, #[error("too many % conversion specifications in suffix")] SuffixFormatTooManyPercents, + #[error("{} is not a regular file", ._0.quote())] + NotRegularFile(String), } impl From for CsplitError { @@ -35,3 +38,9 @@ impl From for CsplitError { CsplitError::IoError(error) } } + +impl UError for CsplitError { + fn code(&self) -> i32 { + 1 + } +} From a84f57dd1f77053999adadd36157ed8e75158d38 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sun, 26 Dec 2021 15:20:09 -0500 Subject: [PATCH 2/2] fixup! csplit: return UResult from uumain() function --- src/uu/csplit/src/csplit.rs | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/uu/csplit/src/csplit.rs b/src/uu/csplit/src/csplit.rs index b2e6914b2..b4bf72d96 100644 --- a/src/uu/csplit/src/csplit.rs +++ b/src/uu/csplit/src/csplit.rs @@ -13,7 +13,7 @@ use std::{ use clap::{crate_version, App, Arg, ArgMatches}; use regex::Regex; use uucore::display::Quotable; -use uucore::error::{FromIo, UError, UResult}; +use uucore::error::{FromIo, UResult}; use uucore::InvalidEncodingHandling; mod csplit_error; @@ -715,13 +715,6 @@ mod tests { } } -fn to_box(e: E) -> Box -where - E: UError + 'static, -{ - Box::new(e) -} - #[uucore_procs::gen_uumain] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let usage = usage(); @@ -744,7 +737,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let options = CsplitOptions::new(&matches); if file_name == "-" { let stdin = io::stdin(); - csplit(&options, patterns, stdin.lock()).map_err(to_box) + Ok(csplit(&options, patterns, stdin.lock())?) } else { let file = File::open(file_name) .map_err_context(|| format!("cannot access {}", file_name.quote()))?; @@ -754,7 +747,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { if !file_metadata.is_file() { return Err(CsplitError::NotRegularFile(file_name.to_string()).into()); } - csplit(&options, patterns, BufReader::new(file)).map_err(to_box) + Ok(csplit(&options, patterns, BufReader::new(file))?) } }