bullet_stream 0.11.0

Bulletproof printing for bullet point text
Documentation
use std::time::Duration;

pub(crate) fn human(duration: &Duration) -> String {
    let hours = (duration.as_secs() / 3600) % 60;
    let minutes = (duration.as_secs() / 60) % 60;
    let seconds = duration.as_secs() % 60;
    let milliseconds = duration.subsec_millis();
    let tenths = milliseconds / 100;

    if hours > 0 {
        format!("{hours}h {minutes}m {seconds}s")
    } else if minutes > 0 {
        format!("{minutes}m {seconds}s")
    } else if seconds > 0 || milliseconds >= 100 {
        format!("{seconds}.{tenths}s")
    } else {
        String::from("< 0.1s")
    }
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_display_duration() {
        let duration = Duration::ZERO;
        assert_eq!(human(&duration), "< 0.1s");

        let duration = Duration::from_millis(99);
        assert_eq!(human(&duration), "< 0.1s");

        let duration = Duration::from_millis(100);
        assert_eq!(human(&duration), "0.1s");

        let duration = Duration::from_millis(210);
        assert_eq!(human(&duration), "0.2s");

        let duration = Duration::from_millis(1100);
        assert_eq!(human(&duration), "1.1s");

        let duration = Duration::from_millis(9100);
        assert_eq!(human(&duration), "9.1s");

        let duration = Duration::from_millis(10100);
        assert_eq!(human(&duration), "10.1s");

        let duration = Duration::from_millis(52100);
        assert_eq!(human(&duration), "52.1s");

        let duration = Duration::from_millis(60 * 1000);
        assert_eq!(human(&duration), "1m 0s");

        let duration = Duration::from_millis(60 * 1000 + 2000);
        assert_eq!(human(&duration), "1m 2s");

        let duration = Duration::from_millis(60 * 60 * 1000 - 1);
        assert_eq!(human(&duration), "59m 59s");

        let duration = Duration::from_millis(60 * 60 * 1000);
        assert_eq!(human(&duration), "1h 0m 0s");

        let duration = Duration::from_millis(75 * 60 * 1000 - 1);
        assert_eq!(human(&duration), "1h 14m 59s");
    }
}