diff --git a/src/uu/stty/src/stty.rs b/src/uu/stty/src/stty.rs index be530716321..f2710a05b8f 100644 --- a/src/uu/stty/src/stty.rs +++ b/src/uu/stty/src/stty.rs @@ -249,80 +249,42 @@ fn stty(opts: &Options) -> UResult<()> { let mut args_iter = args.iter(); while let Some(&arg) = args_iter.next() { match arg { - "ispeed" => match args_iter.next() { - Some(speed) => { - if let Some(baud_flag) = string_to_baud(speed, flags::BaudType::Input) { - valid_args.push(ArgOptions::Flags(baud_flag)); - } else { - return invalid_speed(arg, speed); - } - } - None => { - return missing_arg(arg); - } - }, - "ospeed" => match args_iter.next() { - Some(speed) => { - if let Some(baud_flag) = string_to_baud(speed, flags::BaudType::Output) { - valid_args.push(ArgOptions::Flags(baud_flag)); - } else { - return invalid_speed(arg, speed); - } - } - None => { - return missing_arg(arg); - } - }, - "line" => match args_iter.next() { - Some(line) => match parse_u8_or_err(line) { - Ok(n) => valid_args.push(ArgOptions::Special(SpecialSetting::Line(n))), - Err(e) => return Err(USimpleError::new(1, e)), - }, - None => { - return missing_arg(arg); - } - }, - "min" => match args_iter.next() { - Some(min) => match parse_u8_or_err(min) { - Ok(n) => { - valid_args.push(ArgOptions::Mapping((S::VMIN, n))); - } - Err(e) => return Err(USimpleError::new(1, e)), - }, - None => { - return missing_arg(arg); - } - }, - "time" => match args_iter.next() { - Some(time) => match parse_u8_or_err(time) { - Ok(n) => valid_args.push(ArgOptions::Mapping((S::VTIME, n))), - Err(e) => return Err(USimpleError::new(1, e)), - }, - None => { - return missing_arg(arg); - } - }, + "ispeed" => { + let speed = args_iter.next().ok_or_else(|| missing_arg(arg))?; + let baud_flag = string_to_baud(speed, flags::BaudType::Input) + .ok_or_else(|| invalid_speed(arg, speed))?; + valid_args.push(ArgOptions::Flags(baud_flag)); + } + "ospeed" => { + let speed = args_iter.next().ok_or_else(|| missing_arg(arg))?; + let baud_flag = string_to_baud(speed, flags::BaudType::Output) + .ok_or_else(|| invalid_speed(arg, speed))?; + valid_args.push(ArgOptions::Flags(baud_flag)); + } + "line" => { + let line = args_iter.next().ok_or_else(|| missing_arg(arg))?; + let n = parse_u8_or_err(line).map_err(|e| USimpleError::new(1, e))?; + valid_args.push(ArgOptions::Special(SpecialSetting::Line(n))); + } + "min" => { + let min = args_iter.next().ok_or_else(|| missing_arg(arg))?; + let n = parse_u8_or_err(min).map_err(|e| USimpleError::new(1, e))?; + valid_args.push(ArgOptions::Mapping((S::VMIN, n))); + } + "time" => { + let time = args_iter.next().ok_or_else(|| missing_arg(arg))?; + let n = parse_u8_or_err(time).map_err(|e| USimpleError::new(1, e))?; + valid_args.push(ArgOptions::Mapping((S::VTIME, n))); + } "rows" => { - if let Some(rows) = args_iter.next() { - if let Some(n) = parse_rows_cols(rows) { - valid_args.push(ArgOptions::Special(SpecialSetting::Rows(n))); - } else { - return invalid_integer_arg(rows); - } - } else { - return missing_arg(arg); - } + let rows = args_iter.next().ok_or_else(|| missing_arg(arg))?; + let n = parse_rows_cols(rows).ok_or_else(|| invalid_integer_arg(rows))?; + valid_args.push(ArgOptions::Special(SpecialSetting::Rows(n))); } "columns" | "cols" => { - if let Some(cols) = args_iter.next() { - if let Some(n) = parse_rows_cols(cols) { - valid_args.push(ArgOptions::Special(SpecialSetting::Cols(n))); - } else { - return invalid_integer_arg(cols); - } - } else { - return missing_arg(arg); - } + let cols = args_iter.next().ok_or_else(|| missing_arg(arg))?; + let n = parse_rows_cols(cols).ok_or_else(|| invalid_integer_arg(cols))?; + valid_args.push(ArgOptions::Special(SpecialSetting::Cols(n))); } "drain" => { set_arg = SetArg::TCSADRAIN; @@ -340,28 +302,25 @@ fn stty(opts: &Options) -> UResult<()> { } // control char else if let Some(char_index) = cc_to_index(arg) { - if let Some(mapping) = args_iter.next() { - let cc_mapping = string_to_control_char(mapping).map_err(|e| { - let message = match e { - ControlCharMappingError::IntOutOfRange(val) => { - translate!( - "stty-error-invalid-integer-argument-value-too-large", - "value" => format!("'{val}'") - ) - } - ControlCharMappingError::MultipleChars(val) => { - translate!( - "stty-error-invalid-integer-argument", - "value" => format!("'{val}'") - ) - } - }; - UUsageError::new(1, message) - })?; - valid_args.push(ArgOptions::Mapping((char_index, cc_mapping))); - } else { - return missing_arg(arg); - } + let mapping = args_iter.next().ok_or_else(|| missing_arg(arg))?; + let cc_mapping = string_to_control_char(mapping).map_err(|e| { + let message = match e { + ControlCharMappingError::IntOutOfRange(val) => { + translate!( + "stty-error-invalid-integer-argument-value-too-large", + "value" => format!("'{val}'") + ) + } + ControlCharMappingError::MultipleChars(val) => { + translate!( + "stty-error-invalid-integer-argument", + "value" => format!("'{val}'") + ) + } + }; + UUsageError::new(1, message) + })?; + valid_args.push(ArgOptions::Mapping((char_index, cc_mapping))); // baud rate } else if let Some(baud_flag) = string_to_baud(arg, flags::BaudType::Both) { valid_args.push(ArgOptions::Flags(baud_flag)); @@ -377,14 +336,13 @@ fn stty(opts: &Options) -> UResult<()> { AllFlags::OutputFlags((flag, remove)) => check_flag_group(flag, remove), }; if remove_group { - return invalid_arg(arg); + return Err(invalid_arg(arg)); } valid_args.push(flag.into()); // combination setting - } else if let Some(combo) = string_to_combo(arg) { - valid_args.append(&mut combo_to_flags(combo)); } else { - return invalid_arg(arg); + let combo = string_to_combo(arg).ok_or_else(|| invalid_arg(arg))?; + valid_args.append(&mut combo_to_flags(combo)); } } } @@ -418,45 +376,45 @@ fn stty(opts: &Options) -> UResult<()> { } // The GNU implementation adds the --help message when the args are incorrectly formatted -fn missing_arg(arg: &str) -> Result> { - Err(UUsageError::new( +fn missing_arg(arg: &str) -> Box { + UUsageError::new( 1, translate!( "stty-error-missing-argument", "arg" => *arg ), - )) + ) } -fn invalid_arg(arg: &str) -> Result> { - Err(UUsageError::new( +fn invalid_arg(arg: &str) -> Box { + UUsageError::new( 1, translate!( "stty-error-invalid-argument", "arg" => *arg ), - )) + ) } -fn invalid_integer_arg(arg: &str) -> Result> { - Err(UUsageError::new( +fn invalid_integer_arg(arg: &str) -> Box { + UUsageError::new( 1, translate!( "stty-error-invalid-integer-argument", "value" => format!("'{arg}'") ), - )) + ) } -fn invalid_speed(arg: &str, speed: &str) -> Result> { - Err(UUsageError::new( +fn invalid_speed(arg: &str, speed: &str) -> Box { + UUsageError::new( 1, translate!( "stty-error-invalid-speed", "arg" => arg, "speed" => speed, ), - )) + ) } /// GNU uses different error messages if values overflow or underflow a u8,