claude-dashboard 0.2.2

A terminal TUI dashboard that renders Claude Code usage reports with token stats, project breakdowns, and language distribution.
Documentation
/// Format a token count for human display.
pub fn format_tokens(n: u64) -> String {
    if n >= 1_000_000 {
        format!("{:.1}M", n as f64 / 1_000_000.0)
    } else if n >= 1_000 {
        format!("{}K", n / 1_000)
    } else {
        n.to_string()
    }
}

/// Format a duration in seconds to a human-readable string.
pub fn format_duration(secs: u64) -> String {
    if secs >= 3600 {
        format!("{:.1}h", secs as f64 / 3600.0)
    } else if secs >= 60 {
        format!("{}m", secs / 60)
    } else {
        format!("{}s", secs)
    }
}

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

    #[test]
    fn test_format_tokens_millions() {
        assert_eq!(format_tokens(5_200_000), "5.2M");
        assert_eq!(format_tokens(1_000_000), "1.0M");
        assert_eq!(format_tokens(12_500_000), "12.5M");
    }

    #[test]
    fn test_format_tokens_kilo() {
        assert_eq!(format_tokens(123_000), "123K");
        assert_eq!(format_tokens(1_000), "1K");
        assert_eq!(format_tokens(999), "999");
    }

    #[test]
    fn test_format_tokens_small() {
        assert_eq!(format_tokens(500), "500");
        assert_eq!(format_tokens(0), "0");
    }

    #[test]
    fn test_format_tokens_boundary_values() {
        // Exactly at boundaries
        assert_eq!(format_tokens(999), "999");
        assert_eq!(format_tokens(1_000), "1K");
        assert_eq!(format_tokens(999_999), "999K");
        assert_eq!(format_tokens(1_000_000), "1.0M");

        // One less than boundary
        assert_eq!(format_tokens(999), "999");
        assert_eq!(format_tokens(999_999), "999K");

        // One more than boundary
        assert_eq!(format_tokens(1_001), "1K"); // integer division
        assert_eq!(format_tokens(1_000_001), "1.0M");
    }

    #[test]
    fn test_format_tokens_large_values() {
        assert_eq!(format_tokens(100_000_000), "100.0M");
        assert_eq!(format_tokens(1_500_000_000), "1500.0M");
    }
}