| 10 | const RANDOM_MAX: usize = 1024; |
| 11 | |
| 12 | pub(crate) fn parse_duration_str(name: &str) -> Option<Duration> { |
| 13 | if let Some(hours) = name |
| 14 | .strip_suffix("hours") |
| 15 | .or_else(|| name.strip_suffix("hour")) |
| 16 | .or_else(|| name.strip_suffix("hrs")) |
| 17 | .or_else(|| name.strip_suffix("hr")) |
| 18 | .or_else(|| name.strip_suffix("h")) |
| 19 | { |
| 20 | return Some(Duration::from_secs_f64(hours.parse::<f64>().ok()? * 60.0 * 60.0)); |
| 21 | } |
| 22 | else if let Some(mins) = name |
| 23 | .strip_suffix("minutes") |
| 24 | .or_else(|| name.strip_suffix("minute")) |
| 25 | .or_else(|| name.strip_suffix("mins")) |
| 26 | .or_else(|| name.strip_suffix("min")) |
| 27 | .or_else(|| name.strip_suffix("m")) |
| 28 | { |
| 29 | return Some(Duration::from_secs_f64(mins.parse::<f64>().ok()? * 60.0)); |
| 30 | } |
| 31 | else if let Some(seconds) = name |
| 32 | .strip_suffix("seconds") |
| 33 | .or_else(|| name.strip_suffix("second")) |
| 34 | .or_else(|| name.strip_suffix("secs")) |
| 35 | .or_else(|| name.strip_suffix("sec")) |
| 36 | .or_else(|| name.strip_suffix("s")) |
| 37 | { |
| 38 | return Some(Duration::from_secs_f64(seconds.parse::<f64>().ok()?)); |
| 39 | } |
| 40 | None |
| 41 | } |
| 42 | |
| 43 | /// Fill `buf` with random bytes. |
| 44 | pub(crate) fn random_bytes<R: Rng>(rng: &mut R, buf: &mut Vec<u8>) { |