1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 11:37:44 +00:00

Merge pull request #2791 from jfinkels/csplit-uresult

csplit: return UResult from uumain() function
This commit is contained in:
Terts Diepraam 2021-12-29 15:21:56 +01:00 committed by GitHub
commit 25c10ad540
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 12 deletions

View file

@ -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> {

View file

@ -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<io::Error> for CsplitError {
@ -35,3 +38,9 @@ impl From<io::Error> for CsplitError {
CsplitError::IoError(error)
}
}
impl UError for CsplitError {
fn code(&self) -> i32 {
1
}
}