timecalc/
formatter.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use chrono::Duration;

/// Format a [duration](chrono::Duration) into a [String].
///
/// ## Example
/// ```
/// use chrono::Duration;
/// use timecalc::formatter::duration_to_str;
///
/// assert_eq!(duration_to_str(Duration::hours(1)), "1h");
/// assert_eq!(duration_to_str(Duration::minutes(30)), "30m");
/// assert_eq!(duration_to_str(Duration::hours(1) + Duration::minutes(30)), "1h 30m");
/// ```
pub fn duration_to_str(duration: Duration) -> String {
    if duration == Duration::zero() {
        return "0m".to_string();
    }

    let weeks = duration.num_weeks();
    let days = duration.num_days() % 7;
    let hours = duration.num_hours() % 24;
    let minutes = duration.num_minutes() % 60;

    let mut output = String::new();
    if weeks != 0 {
        output.push_str(&format!("{}w ", weeks));
    }
    if days != 0 {
        output.push_str(&format!("{}d ", days));
    }
    if hours != 0 {
        output.push_str(&format!("{}h ", hours));
    }
    if minutes != 0 {
        output.push_str(&format!("{}m", minutes));
    }

    output.trim().to_string()
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_duration_to_str() {
        assert_eq!(
            duration_to_str(
                Duration::weeks(1) + Duration::days(2) + Duration::hours(3) + Duration::minutes(4)
            ),
            "1w 2d 3h 4m"
        );
        assert_eq!(
            duration_to_str(Duration::weeks(1) + Duration::days(2) + Duration::hours(3)),
            "1w 2d 3h"
        );
        assert_eq!(
            duration_to_str(Duration::weeks(1) + Duration::days(2)),
            "1w 2d"
        );
        assert_eq!(duration_to_str(Duration::weeks(1)), "1w");
        assert_eq!(duration_to_str(Duration::days(2)), "2d");
        assert_eq!(duration_to_str(Duration::hours(3)), "3h");
        assert_eq!(duration_to_str(Duration::minutes(4)), "4m");
        assert_eq!(
            duration_to_str(Duration::days(1) - Duration::hours(1)),
            "23h"
        );
        assert_eq!(duration_to_str(Duration::zero()), "0m");
    }
}