mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-31 04:57:45 +00:00
split: move to thiserror
This commit is contained in:
parent
4aba193c9c
commit
9db51ec828
5 changed files with 25 additions and 58 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -3229,6 +3229,7 @@ version = "0.0.30"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"memchr",
|
"memchr",
|
||||||
|
"thiserror 2.0.12",
|
||||||
"uucore",
|
"uucore",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ path = "src/split.rs"
|
||||||
clap = { workspace = true }
|
clap = { workspace = true }
|
||||||
memchr = { workspace = true }
|
memchr = { workspace = true }
|
||||||
uucore = { workspace = true, features = ["fs"] }
|
uucore = { workspace = true, features = ["fs"] }
|
||||||
|
thiserror = { workspace = true }
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "split"
|
name = "split"
|
||||||
|
|
|
@ -39,8 +39,8 @@ use crate::{
|
||||||
OPT_NUMERIC_SUFFIXES_SHORT, OPT_SUFFIX_LENGTH,
|
OPT_NUMERIC_SUFFIXES_SHORT, OPT_SUFFIX_LENGTH,
|
||||||
};
|
};
|
||||||
use clap::ArgMatches;
|
use clap::ArgMatches;
|
||||||
use std::fmt;
|
|
||||||
use std::path::is_separator;
|
use std::path::is_separator;
|
||||||
|
use thiserror::Error;
|
||||||
use uucore::display::Quotable;
|
use uucore::display::Quotable;
|
||||||
use uucore::error::{UResult, USimpleError};
|
use uucore::error::{UResult, USimpleError};
|
||||||
|
|
||||||
|
@ -79,31 +79,21 @@ pub struct Suffix {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An error when parsing suffix parameters from command-line arguments.
|
/// An error when parsing suffix parameters from command-line arguments.
|
||||||
|
#[derive(Debug, Error)]
|
||||||
pub enum SuffixError {
|
pub enum SuffixError {
|
||||||
/// Invalid suffix length parameter.
|
/// Invalid suffix length parameter.
|
||||||
|
#[error("invalid suffix length: {}", .0.quote())]
|
||||||
NotParsable(String),
|
NotParsable(String),
|
||||||
|
|
||||||
/// Suffix contains a directory separator, which is not allowed.
|
/// Suffix contains a directory separator, which is not allowed.
|
||||||
|
#[error("invalid suffix {}, contains directory separator", .0.quote())]
|
||||||
ContainsSeparator(String),
|
ContainsSeparator(String),
|
||||||
|
|
||||||
/// Suffix is not large enough to split into specified chunks
|
/// Suffix is not large enough to split into specified chunks
|
||||||
|
#[error("the suffix length needs to be at least {0}")]
|
||||||
TooSmall(usize),
|
TooSmall(usize),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for SuffixError {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
match self {
|
|
||||||
Self::NotParsable(s) => write!(f, "invalid suffix length: {}", s.quote()),
|
|
||||||
Self::TooSmall(i) => write!(f, "the suffix length needs to be at least {i}"),
|
|
||||||
Self::ContainsSeparator(s) => write!(
|
|
||||||
f,
|
|
||||||
"invalid suffix {}, contains directory separator",
|
|
||||||
s.quote()
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Suffix {
|
impl Suffix {
|
||||||
/// Parse the suffix type, start, length and additional suffix from the command-line arguments
|
/// Parse the suffix type, start, length and additional suffix from the command-line arguments
|
||||||
/// as well process suffix length auto-widening and auto-width scenarios
|
/// as well process suffix length auto-widening and auto-width scenarios
|
||||||
|
|
|
@ -15,11 +15,11 @@ use crate::strategy::{NumberType, Strategy, StrategyError};
|
||||||
use clap::{Arg, ArgAction, ArgMatches, Command, ValueHint, parser::ValueSource};
|
use clap::{Arg, ArgAction, ArgMatches, Command, ValueHint, parser::ValueSource};
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::ffi::OsString;
|
use std::ffi::OsString;
|
||||||
use std::fmt;
|
|
||||||
use std::fs::{File, metadata};
|
use std::fs::{File, metadata};
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::io::{BufRead, BufReader, BufWriter, ErrorKind, Read, Seek, SeekFrom, Write, stdin};
|
use std::io::{BufRead, BufReader, BufWriter, ErrorKind, Read, Seek, SeekFrom, Write, stdin};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
use thiserror::Error;
|
||||||
use uucore::display::Quotable;
|
use uucore::display::Quotable;
|
||||||
use uucore::error::{FromIo, UIoError, UResult, USimpleError, UUsageError};
|
use uucore::error::{FromIo, UIoError, UResult, USimpleError, UUsageError};
|
||||||
use uucore::parse_size::parse_size_u64;
|
use uucore::parse_size::parse_size_u64;
|
||||||
|
@ -411,31 +411,39 @@ struct Settings {
|
||||||
io_blksize: Option<u64>,
|
io_blksize: Option<u64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Error)]
|
||||||
/// An error when parsing settings from command-line arguments.
|
/// An error when parsing settings from command-line arguments.
|
||||||
enum SettingsError {
|
enum SettingsError {
|
||||||
/// Invalid chunking strategy.
|
/// Invalid chunking strategy.
|
||||||
|
#[error("{0}")]
|
||||||
Strategy(StrategyError),
|
Strategy(StrategyError),
|
||||||
|
|
||||||
/// Invalid suffix length parameter.
|
/// Invalid suffix length parameter.
|
||||||
|
#[error("{0}")]
|
||||||
Suffix(SuffixError),
|
Suffix(SuffixError),
|
||||||
|
|
||||||
/// Multi-character (Invalid) separator
|
/// Multi-character (Invalid) separator
|
||||||
|
#[error("multi-character separator {}", .0.quote())]
|
||||||
MultiCharacterSeparator(String),
|
MultiCharacterSeparator(String),
|
||||||
|
|
||||||
/// Multiple different separator characters
|
/// Multiple different separator characters
|
||||||
|
#[error("multiple separator characters specified")]
|
||||||
MultipleSeparatorCharacters,
|
MultipleSeparatorCharacters,
|
||||||
|
|
||||||
/// Using `--filter` with `--number` option sub-strategies that print Kth chunk out of N chunks to stdout
|
/// Using `--filter` with `--number` option sub-strategies that print Kth chunk out of N chunks to stdout
|
||||||
/// K/N
|
/// K/N
|
||||||
/// l/K/N
|
/// l/K/N
|
||||||
/// r/K/N
|
/// r/K/N
|
||||||
|
#[error("--filter does not process a chunk extracted to stdout")]
|
||||||
FilterWithKthChunkNumber,
|
FilterWithKthChunkNumber,
|
||||||
|
|
||||||
/// Invalid IO block size
|
/// Invalid IO block size
|
||||||
|
#[error("invalid IO block size: {}", .0.quote())]
|
||||||
InvalidIOBlockSize(String),
|
InvalidIOBlockSize(String),
|
||||||
|
|
||||||
/// The `--filter` option is not supported on Windows.
|
/// The `--filter` option is not supported on Windows.
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
|
#[error("{OPT_FILTER} is currently not supported in this platform")]
|
||||||
NotSupported,
|
NotSupported,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -450,30 +458,6 @@ impl SettingsError {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for SettingsError {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
match self {
|
|
||||||
Self::Strategy(e) => e.fmt(f),
|
|
||||||
Self::Suffix(e) => e.fmt(f),
|
|
||||||
Self::MultiCharacterSeparator(s) => {
|
|
||||||
write!(f, "multi-character separator {}", s.quote())
|
|
||||||
}
|
|
||||||
Self::MultipleSeparatorCharacters => {
|
|
||||||
write!(f, "multiple separator characters specified")
|
|
||||||
}
|
|
||||||
Self::FilterWithKthChunkNumber => {
|
|
||||||
write!(f, "--filter does not process a chunk extracted to stdout")
|
|
||||||
}
|
|
||||||
Self::InvalidIOBlockSize(s) => write!(f, "invalid IO block size: {}", s.quote()),
|
|
||||||
#[cfg(windows)]
|
|
||||||
Self::NotSupported => write!(
|
|
||||||
f,
|
|
||||||
"{OPT_FILTER} is currently not supported in this platform"
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Settings {
|
impl Settings {
|
||||||
/// Parse a strategy from the command-line arguments.
|
/// Parse a strategy from the command-line arguments.
|
||||||
fn from(matches: &ArgMatches, obs_lines: &Option<String>) -> Result<Self, SettingsError> {
|
fn from(matches: &ArgMatches, obs_lines: &Option<String>) -> Result<Self, SettingsError> {
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
use crate::{OPT_BYTES, OPT_LINE_BYTES, OPT_LINES, OPT_NUMBER};
|
use crate::{OPT_BYTES, OPT_LINE_BYTES, OPT_LINES, OPT_NUMBER};
|
||||||
use clap::{ArgMatches, parser::ValueSource};
|
use clap::{ArgMatches, parser::ValueSource};
|
||||||
use std::fmt;
|
use thiserror::Error;
|
||||||
use uucore::{
|
use uucore::{
|
||||||
display::Quotable,
|
display::Quotable,
|
||||||
parse_size::{ParseSizeError, parse_size_u64, parse_size_u64_max},
|
parse_size::{ParseSizeError, parse_size_u64, parse_size_u64_max},
|
||||||
|
@ -54,7 +54,7 @@ impl NumberType {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An error due to an invalid parameter to the `-n` command-line option.
|
/// An error due to an invalid parameter to the `-n` command-line option.
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq, Error)]
|
||||||
pub enum NumberTypeError {
|
pub enum NumberTypeError {
|
||||||
/// The number of chunks was invalid.
|
/// The number of chunks was invalid.
|
||||||
///
|
///
|
||||||
|
@ -69,6 +69,7 @@ pub enum NumberTypeError {
|
||||||
/// -n r/N
|
/// -n r/N
|
||||||
/// -n r/K/N
|
/// -n r/K/N
|
||||||
/// ```
|
/// ```
|
||||||
|
#[error("invalid number of chunks: {}", .0.quote())]
|
||||||
NumberOfChunks(String),
|
NumberOfChunks(String),
|
||||||
|
|
||||||
/// The chunk number was invalid.
|
/// The chunk number was invalid.
|
||||||
|
@ -83,6 +84,7 @@ pub enum NumberTypeError {
|
||||||
/// -n l/K/N
|
/// -n l/K/N
|
||||||
/// -n r/K/N
|
/// -n r/K/N
|
||||||
/// ```
|
/// ```
|
||||||
|
#[error("invalid chunk number: {}", .0.quote())]
|
||||||
ChunkNumber(String),
|
ChunkNumber(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,36 +193,25 @@ pub enum Strategy {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An error when parsing a chunking strategy from command-line arguments.
|
/// An error when parsing a chunking strategy from command-line arguments.
|
||||||
|
#[derive(Debug, Error)]
|
||||||
pub enum StrategyError {
|
pub enum StrategyError {
|
||||||
/// Invalid number of lines.
|
/// Invalid number of lines.
|
||||||
|
#[error("invalid number of lines: {0}")]
|
||||||
Lines(ParseSizeError),
|
Lines(ParseSizeError),
|
||||||
|
|
||||||
/// Invalid number of bytes.
|
/// Invalid number of bytes.
|
||||||
|
#[error("invalid number of bytes: {0}")]
|
||||||
Bytes(ParseSizeError),
|
Bytes(ParseSizeError),
|
||||||
|
|
||||||
/// Invalid number type.
|
/// Invalid number type.
|
||||||
|
#[error("{0}")]
|
||||||
NumberType(NumberTypeError),
|
NumberType(NumberTypeError),
|
||||||
|
|
||||||
/// Multiple chunking strategies were specified (but only one should be).
|
/// Multiple chunking strategies were specified (but only one should be).
|
||||||
|
#[error("cannot split in more than one way")]
|
||||||
MultipleWays,
|
MultipleWays,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for StrategyError {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
match self {
|
|
||||||
Self::Lines(e) => write!(f, "invalid number of lines: {e}"),
|
|
||||||
Self::Bytes(e) => write!(f, "invalid number of bytes: {e}"),
|
|
||||||
Self::NumberType(NumberTypeError::NumberOfChunks(s)) => {
|
|
||||||
write!(f, "invalid number of chunks: {}", s.quote())
|
|
||||||
}
|
|
||||||
Self::NumberType(NumberTypeError::ChunkNumber(s)) => {
|
|
||||||
write!(f, "invalid chunk number: {}", s.quote())
|
|
||||||
}
|
|
||||||
Self::MultipleWays => write!(f, "cannot split in more than one way"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Strategy {
|
impl Strategy {
|
||||||
/// Parse a strategy from the command-line arguments.
|
/// Parse a strategy from the command-line arguments.
|
||||||
pub fn from(matches: &ArgMatches, obs_lines: &Option<String>) -> Result<Self, StrategyError> {
|
pub fn from(matches: &ArgMatches, obs_lines: &Option<String>) -> Result<Self, StrategyError> {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue