pub mod app_config_reader;
pub mod config_reader;
pub mod elastic_queue;
pub mod feature;
pub mod managed_cache;
pub mod multi_level_map;
pub mod overrides;
pub mod resources;
pub mod w3c_trace;
pub(crate) fn elapsed_time(duration: std::time::Duration) -> String {
const ONE_SECOND_MS: u128 = 1000;
const ONE_MINUTE_MS: u128 = 60 * ONE_SECOND_MS;
const ONE_HOUR_MS: u128 = 60 * ONE_MINUTE_MS;
const ONE_DAY_MS: u128 = 24 * ONE_HOUR_MS;
let mut time = duration.as_millis();
let mut parts: Vec<String> = Vec::new();
if time > ONE_DAY_MS {
let days = time / ONE_DAY_MS;
parts.push(format!("{days} day{}", if days == 1 { "" } else { "s" }));
time -= days * ONE_DAY_MS;
}
if time > ONE_HOUR_MS {
let hours = time / ONE_HOUR_MS;
parts.push(format!("{hours} hour{}", if hours == 1 { "" } else { "s" }));
time -= hours * ONE_HOUR_MS;
}
if time > ONE_MINUTE_MS {
let minutes = time / ONE_MINUTE_MS;
parts.push(format!(
"{minutes} minute{}",
if minutes == 1 { "" } else { "s" }
));
time -= minutes * ONE_MINUTE_MS;
}
if time >= ONE_SECOND_MS {
let seconds = time / ONE_SECOND_MS;
parts.push(format!(
"{seconds} second{}",
if seconds == 1 { "" } else { "s" }
));
}
if parts.is_empty() {
format!("{time} ms")
} else {
parts.join(" ")
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::time::Duration;
#[test]
fn elapsed_time_matches_java_utility() {
assert_eq!(elapsed_time(Duration::from_millis(0)), "0 ms");
assert_eq!(elapsed_time(Duration::from_millis(500)), "500 ms");
assert_eq!(elapsed_time(Duration::from_secs(1)), "1 second");
assert_eq!(elapsed_time(Duration::from_secs(61)), "1 minute 1 second");
assert_eq!(elapsed_time(Duration::from_secs(60)), "60 seconds");
assert_eq!(elapsed_time(Duration::from_secs(3600)), "60 minutes");
assert_eq!(elapsed_time(Duration::from_secs(86_400)), "24 hours");
assert_eq!(elapsed_time(Duration::from_secs(120)), "2 minutes");
assert_eq!(elapsed_time(Duration::from_secs(1800)), "30 minutes");
assert_eq!(
elapsed_time(Duration::from_secs(90_061)),
"1 day 1 hour 1 minute 1 second"
);
}
}