Duration to String enhanced with tests
Adds checks for if a bit in a u8 is set or clear
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
use std::time::Duration;
|
||||
|
||||
pub const SECONDS_IN_MINUTE: u32 = 60;
|
||||
pub const SECONDS_IN_HOUR: u32 = SECONDS_IN_MINUTE * 60;
|
||||
pub const SECONDS_IN_DAY: u32 = SECONDS_IN_HOUR * 24;
|
||||
|
||||
pub fn duration_to_string(to_convert: Duration, show_zeros: Option<bool>) -> String {
|
||||
const SECONDS_IN_DAY: u32 = 86400;
|
||||
const SECONDS_IN_HOUR: u32 = 3600;
|
||||
const SECONDS_IN_MINUTE: u32 = 60;
|
||||
|
||||
let should_show_zero = show_zeros.unwrap_or(false);
|
||||
let mut total_seconds = to_convert.as_secs() as u32;
|
||||
let mut parts = Vec::new();
|
||||
|
||||
let units = [
|
||||
(SECONDS_IN_DAY, "day"),
|
||||
(SECONDS_IN_HOUR, "hour"),
|
||||
(SECONDS_IN_MINUTE, "minute"),
|
||||
(1, "second"),
|
||||
];
|
||||
|
||||
for &(unit_seconds, unit_name) in &units {
|
||||
let count = total_seconds / unit_seconds;
|
||||
total_seconds %= unit_seconds;
|
||||
|
||||
if count > 0 || should_show_zero {
|
||||
let label = if count == 1 {
|
||||
unit_name.to_string()
|
||||
} else {
|
||||
format!("{}s", unit_name)
|
||||
};
|
||||
parts.push(format!("{} {}", count, label));
|
||||
}
|
||||
}
|
||||
|
||||
parts.join(" ")
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
pub mod duration_to_string;
|
||||
mod tests;
|
||||
@@ -0,0 +1,43 @@
|
||||
use std::time::Duration;
|
||||
use crate::duration_to_string::duration_to_string::duration_to_string;
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
use crate::duration_to_string::duration_to_string::*;
|
||||
|
||||
#[test]
|
||||
fn multi_duration_to_string() {
|
||||
let params: Vec<(&str, Duration, Option<bool>)> = vec![
|
||||
("1 second", Duration::from_secs(1), Some(false)),
|
||||
("4 seconds", Duration::from_secs(4), Some(false)),
|
||||
("1 minute", Duration::from_secs(SECONDS_IN_MINUTE as u64), Some(false)),
|
||||
("4 minutes", Duration::from_secs((SECONDS_IN_MINUTE * 4) as u64), Some(false)),
|
||||
("1 hour", Duration::from_secs(SECONDS_IN_HOUR as u64), Some(false)),
|
||||
("4 hours", Duration::from_secs((SECONDS_IN_HOUR * 4) as u64), Some(false)),
|
||||
("4 hours 5 minutes", Duration::from_secs((SECONDS_IN_HOUR * 4 + SECONDS_IN_MINUTE * 5) as u64), Some(false)),
|
||||
("1 day", Duration::from_secs(SECONDS_IN_DAY as u64), Some(false)),
|
||||
("0 days 0 hours 0 minutes 1 second", Duration::from_secs(1), Some(true)),
|
||||
("0 days 0 hours 0 minutes 4 seconds", Duration::from_secs(4), Some(true)),
|
||||
("0 days 0 hours 1 minute 0 seconds", Duration::from_secs(SECONDS_IN_MINUTE as u64), Some(true)),
|
||||
("0 days 0 hours 4 minutes 0 seconds", Duration::from_secs((SECONDS_IN_MINUTE * 4) as u64), Some(true)),
|
||||
("0 days 1 hour 0 minutes 0 seconds", Duration::from_secs(SECONDS_IN_HOUR as u64), Some(true)),
|
||||
("0 days 4 hours 0 minutes 0 seconds", Duration::from_secs((SECONDS_IN_HOUR * 4) as u64), Some(true)),
|
||||
("0 days 4 hours 5 minutes 0 seconds", Duration::from_secs((SECONDS_IN_HOUR * 4 + SECONDS_IN_MINUTE * 5) as u64), Some(true)),
|
||||
("1 day 0 hours 0 minutes 0 seconds", Duration::from_secs(SECONDS_IN_DAY as u64), Some(true)),
|
||||
("1 day 0 hours 0 minutes 1 second", Duration::from_secs((SECONDS_IN_DAY + 1) as u64), Some(true)),
|
||||
("1 second", Duration::from_secs(1), None),
|
||||
("4 seconds", Duration::from_secs(4), None),
|
||||
("1 minute", Duration::from_secs(SECONDS_IN_MINUTE as u64), None),
|
||||
("4 minutes", Duration::from_secs((SECONDS_IN_MINUTE * 4) as u64), None),
|
||||
("1 hour", Duration::from_secs(SECONDS_IN_HOUR as u64), None),
|
||||
("4 hours", Duration::from_secs((SECONDS_IN_HOUR * 4) as u64), None),
|
||||
("4 hours 5 minutes", Duration::from_secs((SECONDS_IN_HOUR * 4 + SECONDS_IN_MINUTE * 5) as u64), None),
|
||||
("1 day", Duration::from_secs(SECONDS_IN_DAY as u64), None),
|
||||
];
|
||||
|
||||
for (expected, actual, show) in params {
|
||||
assert_eq!(expected, duration_to_string(actual, show));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user