From 755dc5619dd9f545ec7b4441bc3b2a99a0fb1ffd Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sun, 8 Nov 2020 22:58:31 +0800 Subject: [PATCH] feat: add parse_duration --- src/util_time.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/util_time.rs b/src/util_time.rs index deee5d8..a4070e1 100644 --- a/src/util_time.rs +++ b/src/util_time.rs @@ -1,4 +1,5 @@ use std::time::SystemTime; +use std::time::Duration; pub fn get_current_secs() -> u64 { SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).map(|d| d.as_secs()).unwrap_or(0 /* SHOULD NOT HAPPEN */ ) @@ -7,3 +8,35 @@ pub fn get_current_secs() -> u64 { pub fn get_current_millis() -> u128 { SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).map(|d| d.as_millis()).unwrap_or(0 /* SHOULD NOT HAPPEN */ ) } + +pub fn parse_duration(t: &str) -> Option { + if t.is_empty() { + return None; + } + let parse_and_process_time = |mul: u32| { + t[..t.len() - 1].parse::().map(|ti| Duration::from_millis((ti * mul as f64) as u64)).ok() + }; + match t.to_ascii_lowercase().chars().last() { + Some('s') => parse_and_process_time(1000), + Some('m') => parse_and_process_time(60 * 1000), + Some('h') => parse_and_process_time(60 * 60 * 1000), + Some('d') => parse_and_process_time(24 * 60 * 60 * 1000), + _ => t.parse::().map(|t| Duration::from_millis(t)).ok(), + } +} + +#[test] +fn test_parse_duration() { + assert_eq!(None, parse_duration("")); + assert_eq!(None, parse_duration("X")); + assert_eq!(None, parse_duration("S")); + assert_eq!(Duration::from_millis(1), parse_duration("1").unwrap()); + assert_eq!(Duration::from_millis(100), parse_duration("100").unwrap()); + assert_eq!(Duration::from_millis(1000), parse_duration("1s").unwrap()); + assert_eq!(Duration::from_millis(2000), parse_duration("2S").unwrap()); + assert_eq!(Duration::from_millis(1500), parse_duration("1.5s").unwrap()); + assert_eq!(Duration::from_millis(60000), parse_duration("1m").unwrap()); + assert_eq!(Duration::from_millis(3600000), parse_duration("1h").unwrap()); + assert_eq!(Duration::from_millis(1800000), parse_duration("0.5h").unwrap()); + assert_eq!(Duration::from_millis(24*3600000), parse_duration("1d").unwrap()); +} \ No newline at end of file