From 58f2000406b34b83e9d57ff6e90c4d2d42513839 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sat, 15 Jan 2022 16:12:15 -0500 Subject: [PATCH] split: method to convert ArgMatches to Settings Create a `Settings::from` method that converts a `clap::ArgMatches` instance into a `Settings` instance. This eliminates the unnecessary use of a mutable variable when initializing the settings. --- src/uu/split/src/split.rs | 74 ++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 39 deletions(-) diff --git a/src/uu/split/src/split.rs b/src/uu/split/src/split.rs index 04ee3641c..74157c1c2 100644 --- a/src/uu/split/src/split.rs +++ b/src/uu/split/src/split.rs @@ -57,49 +57,11 @@ size is 1000, and default PREFIX is 'x'. With no INPUT, or when INPUT is pub fn uumain(args: impl uucore::Args) -> UResult<()> { let usage = usage(); let long_usage = get_long_usage(); - let matches = uu_app() .usage(&usage[..]) .after_help(&long_usage[..]) .get_matches_from(args); - - let mut settings = Settings { - prefix: "".to_owned(), - numeric_suffix: false, - suffix_length: 0, - additional_suffix: "".to_owned(), - input: "".to_owned(), - filter: None, - strategy: Strategy::Lines(1000), - verbose: false, - }; - - settings.suffix_length = matches - .value_of(OPT_SUFFIX_LENGTH) - .unwrap() - .parse() - .unwrap_or_else(|_| panic!("Invalid number for {}", OPT_SUFFIX_LENGTH)); - - settings.numeric_suffix = matches.occurrences_of(OPT_NUMERIC_SUFFIXES) > 0; - settings.additional_suffix = matches.value_of(OPT_ADDITIONAL_SUFFIX).unwrap().to_owned(); - - settings.verbose = matches.occurrences_of("verbose") > 0; - settings.strategy = Strategy::from(&matches)?; - settings.input = matches.value_of(ARG_INPUT).unwrap().to_owned(); - settings.prefix = matches.value_of(ARG_PREFIX).unwrap().to_owned(); - - if matches.occurrences_of(OPT_FILTER) > 0 { - if cfg!(windows) { - // see https://github.com/rust-lang/rust/issues/29494 - return Err(USimpleError::new( - -1, - format!("{} is currently not supported in this platform", OPT_FILTER), - )); - } else { - settings.filter = Some(matches.value_of(OPT_FILTER).unwrap().to_owned()); - } - } - + let settings = Settings::from(matches)?; split(settings) } @@ -230,6 +192,10 @@ impl Strategy { } } +/// Parameters that control how a file gets split. +/// +/// You can convert an [`ArgMatches`] instance into a [`Settings`] +/// instance by calling [`Settings::from`]. struct Settings { prefix: String, numeric_suffix: bool, @@ -242,6 +208,36 @@ struct Settings { verbose: bool, } +impl Settings { + /// Parse a strategy from the command-line arguments. + fn from(matches: ArgMatches) -> UResult { + let result = Settings { + suffix_length: matches + .value_of(OPT_SUFFIX_LENGTH) + .unwrap() + .parse() + .unwrap_or_else(|_| panic!("Invalid number for {}", OPT_SUFFIX_LENGTH)), + numeric_suffix: matches.occurrences_of(OPT_NUMERIC_SUFFIXES) > 0, + additional_suffix: matches.value_of(OPT_ADDITIONAL_SUFFIX).unwrap().to_owned(), + verbose: matches.occurrences_of("verbose") > 0, + strategy: Strategy::from(&matches)?, + input: matches.value_of(ARG_INPUT).unwrap().to_owned(), + prefix: matches.value_of(ARG_PREFIX).unwrap().to_owned(), + filter: matches.value_of(OPT_FILTER).map(|s| s.to_owned()), + }; + #[cfg(windows)] + if result.filter.is_some() { + // see https://github.com/rust-lang/rust/issues/29494 + return Err(USimpleError::new( + -1, + format!("{} is currently not supported in this platform", OPT_FILTER), + )); + } + + Ok(result) + } +} + trait Splitter { // Consume as much as possible from `reader` so as to saturate `writer`. // Equivalent to finishing one of the part files. Returns the number of