Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 67 additions & 109 deletions src/uu/stty/src/stty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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));
Expand All @@ -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));
}
}
}
Expand Down Expand Up @@ -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<T>(arg: &str) -> Result<T, Box<dyn UError>> {
Err(UUsageError::new(
fn missing_arg(arg: &str) -> Box<dyn UError> {
UUsageError::new(
1,
translate!(
"stty-error-missing-argument",
"arg" => *arg
),
))
)
}

fn invalid_arg<T>(arg: &str) -> Result<T, Box<dyn UError>> {
Err(UUsageError::new(
fn invalid_arg(arg: &str) -> Box<dyn UError> {
UUsageError::new(
1,
translate!(
"stty-error-invalid-argument",
"arg" => *arg
),
))
)
}

fn invalid_integer_arg<T>(arg: &str) -> Result<T, Box<dyn UError>> {
Err(UUsageError::new(
fn invalid_integer_arg(arg: &str) -> Box<dyn UError> {
UUsageError::new(
1,
translate!(
"stty-error-invalid-integer-argument",
"value" => format!("'{arg}'")
),
))
)
}

fn invalid_speed<T>(arg: &str, speed: &str) -> Result<T, Box<dyn UError>> {
Err(UUsageError::new(
fn invalid_speed(arg: &str, speed: &str) -> Box<dyn UError> {
UUsageError::new(
1,
translate!(
"stty-error-invalid-speed",
"arg" => arg,
"speed" => speed,
),
))
)
}

/// GNU uses different error messages if values overflow or underflow a u8,
Expand Down
Loading