timecalc 0.4.15

Calculate the total duration of a given set of intervals and durations
Documentation
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");
    }
}