diff --git a/src/uu/csplit/src/csplit.rs b/src/uu/csplit/src/csplit.rs index 0d99154df..b4bf72d96 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, 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,8 @@ mod tests { } } -pub fn uumain(args: impl uucore::Args) -> i32 { +#[uucore_procs::gen_uumain] +pub fn uumain(args: impl uucore::Args) -> UResult<()> { let usage = usage(); let args = args .collect_str(InvalidEncodingHandling::Ignore) @@ -729,20 +733,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())); + Ok(csplit(&options, patterns, stdin.lock())?) } 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 + Ok(csplit(&options, patterns, BufReader::new(file))?) + } } 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 + } +}