diff --git a/src/uu/sleep/src/sleep.rs b/src/uu/sleep/src/sleep.rs index ada3336df..684f98c95 100644 --- a/src/uu/sleep/src/sleep.rs +++ b/src/uu/sleep/src/sleep.rs @@ -11,6 +11,8 @@ extern crate uucore; use std::thread; use std::time::Duration; +use uucore::error::{UResult, USimpleError}; + use clap::{crate_version, App, Arg}; static ABOUT: &str = "Pause for NUMBER seconds."; @@ -32,17 +34,18 @@ fn get_usage() -> String { ) } -pub fn uumain(args: impl uucore::Args) -> i32 { +#[uucore_procs::gen_uumain] +pub fn uumain(args: impl uucore::Args) -> UResult<()> { let usage = get_usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); if let Some(values) = matches.values_of(options::NUMBER) { let numbers = values.collect(); - sleep(numbers); + return sleep(numbers); } - 0 + Ok(()) } pub fn uu_app() -> App<'static, 'static> { @@ -61,15 +64,15 @@ pub fn uu_app() -> App<'static, 'static> { ) } -fn sleep(args: Vec<&str>) { +fn sleep(args: Vec<&str>) -> UResult<()> { let sleep_dur = - args.iter().fold( + args.iter().try_fold( Duration::new(0, 0), |result, arg| match uucore::parse_time::from_str(&arg[..]) { - Ok(m) => m + result, - Err(f) => crash!(1, "{}", f), + Ok(m) => Ok(m + result), + Err(f) => Err(USimpleError::new(1, format!("{}", f))), }, - ); + )?; - thread::sleep(sleep_dur); + Ok(thread::sleep(sleep_dur)) } diff --git a/tests/by-util/test_sleep.rs b/tests/by-util/test_sleep.rs index a17beddf6..bb42d7974 100644 --- a/tests/by-util/test_sleep.rs +++ b/tests/by-util/test_sleep.rs @@ -110,3 +110,10 @@ fn test_sleep_sum_duration_many() { let duration = before_test.elapsed(); assert!(duration >= millis_900); } + +#[test] +fn test_sleep_wrong_time() { + new_ucmd!() + .args(&["0.1s", "abc"]) + .fails(); +}