2021-08-24 21:24:34 +02:00
|
|
|
use crate::units::{Second, Unit};
|
2018-09-09 08:44:13 -07:00
|
|
|
|
2018-01-18 18:55:27 +01:00
|
|
|
/// Format the given duration as a string. The output-unit can be enforced by setting `unit` to
|
|
|
|
|
/// `Some(target_unit)`. If `unit` is `None`, it will be determined automatically.
|
|
|
|
|
pub fn format_duration(duration: Second, unit: Option<Unit>) -> String {
|
2021-08-22 16:05:03 +02:00
|
|
|
let (duration_fmt, _) = format_duration_unit(duration, unit);
|
|
|
|
|
duration_fmt
|
2018-01-14 20:31:18 +01:00
|
|
|
}
|
|
|
|
|
|
2018-01-18 18:55:27 +01:00
|
|
|
/// Like `format_duration`, but returns the target unit as well.
|
|
|
|
|
pub fn format_duration_unit(duration: Second, unit: Option<Unit>) -> (String, Unit) {
|
2018-09-09 08:44:13 -07:00
|
|
|
let (out_str, out_unit) = format_duration_value(duration, unit);
|
|
|
|
|
|
|
|
|
|
(format!("{} {}", out_str, out_unit.short_name()), out_unit)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Like `format_duration`, but returns the target unit as well.
|
|
|
|
|
pub fn format_duration_value(duration: Second, unit: Option<Unit>) -> (String, Unit) {
|
2018-10-27 16:51:32 -07:00
|
|
|
if (duration < 1.0 && unit.is_none()) || unit == Some(Unit::MilliSecond) {
|
|
|
|
|
(Unit::MilliSecond.format(duration), Unit::MilliSecond)
|
|
|
|
|
} else {
|
|
|
|
|
(Unit::Second.format(duration), Unit::Second)
|
2018-01-14 20:31:18 +01:00
|
|
|
}
|
2018-09-09 08:44:13 -07:00
|
|
|
}
|
|
|
|
|
|
2018-01-18 18:55:27 +01:00
|
|
|
#[test]
|
|
|
|
|
fn test_format_duration_unit_basic() {
|
|
|
|
|
let (out_str, out_unit) = format_duration_unit(1.3, None);
|
|
|
|
|
|
2018-01-24 20:12:17 +01:00
|
|
|
assert_eq!("1.300 s", out_str);
|
2018-01-18 18:55:27 +01:00
|
|
|
assert_eq!(Unit::Second, out_unit);
|
|
|
|
|
|
|
|
|
|
let (out_str, out_unit) = format_duration_unit(1.0, None);
|
|
|
|
|
|
2018-01-24 20:12:17 +01:00
|
|
|
assert_eq!("1.000 s", out_str);
|
2018-01-18 18:55:27 +01:00
|
|
|
assert_eq!(Unit::Second, out_unit);
|
|
|
|
|
|
|
|
|
|
let (out_str, out_unit) = format_duration_unit(0.999, None);
|
|
|
|
|
|
|
|
|
|
assert_eq!("999.0 ms", out_str);
|
|
|
|
|
assert_eq!(Unit::MilliSecond, out_unit);
|
|
|
|
|
|
|
|
|
|
let (out_str, out_unit) = format_duration_unit(0.0, None);
|
|
|
|
|
|
2018-01-24 20:12:17 +01:00
|
|
|
assert_eq!("0.0 ms", out_str);
|
2018-01-18 18:55:27 +01:00
|
|
|
assert_eq!(Unit::MilliSecond, out_unit);
|
|
|
|
|
|
|
|
|
|
let (out_str, out_unit) = format_duration_unit(1000.0, None);
|
|
|
|
|
|
|
|
|
|
assert_eq!("1000.000 s", out_str);
|
|
|
|
|
assert_eq!(Unit::Second, out_unit);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_format_duration_unit_with_unit() {
|
|
|
|
|
let (out_str, out_unit) = format_duration_unit(1.3, Some(Unit::Second));
|
|
|
|
|
|
2018-01-24 20:12:17 +01:00
|
|
|
assert_eq!("1.300 s", out_str);
|
2018-01-18 18:55:27 +01:00
|
|
|
assert_eq!(Unit::Second, out_unit);
|
|
|
|
|
|
|
|
|
|
let (out_str, out_unit) = format_duration_unit(1.3, Some(Unit::MilliSecond));
|
|
|
|
|
|
|
|
|
|
assert_eq!("1300.0 ms", out_str);
|
|
|
|
|
assert_eq!(Unit::MilliSecond, out_unit);
|
|
|
|
|
}
|