use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UsageLimit {
pub utilization: f64,
pub resets_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UsageData {
pub five_hour: UsageLimit,
pub seven_day: UsageLimit,
pub seven_day_oauth_apps: UsageLimit,
pub seven_day_opus: UsageLimit,
}
impl UsageData {
pub fn max_utilization(&self) -> f64 {
[
self.five_hour.utilization,
self.seven_day.utilization,
self.seven_day_oauth_apps.utilization,
self.seven_day_opus.utilization,
]
.iter()
.copied()
.fold(f64::NEG_INFINITY, f64::max)
}
pub fn is_above_threshold(&self, threshold: f64) -> bool {
self.max_utilization() > threshold
}
pub fn is_approaching_limit(&self) -> bool {
self.is_above_threshold(80.0)
}
pub fn is_at_limit(&self) -> bool {
self.is_above_threshold(95.0)
}
}
#[cfg(test)]
mod tests {
use super::*;
fn create_test_usage(five_hour: f64, seven_day: f64, opus: f64) -> UsageData {
UsageData {
five_hour: UsageLimit {
utilization: five_hour,
resets_at: Some("2025-10-20T02:59:59Z".to_string()),
},
seven_day: UsageLimit {
utilization: seven_day,
resets_at: Some("2025-10-23T21:59:59Z".to_string()),
},
seven_day_oauth_apps: UsageLimit {
utilization: 0.0,
resets_at: None,
},
seven_day_opus: UsageLimit {
utilization: opus,
resets_at: Some("2025-10-23T21:59:59Z".to_string()),
},
}
}
#[test]
fn test_max_utilization() {
let usage = create_test_usage(25.0, 50.0, 75.0);
assert_eq!(usage.max_utilization(), 75.0);
}
#[test]
fn test_is_above_threshold() {
let usage = create_test_usage(25.0, 50.0, 75.0);
assert!(usage.is_above_threshold(70.0));
assert!(!usage.is_above_threshold(80.0));
}
#[test]
fn test_is_approaching_limit() {
let usage_safe = create_test_usage(25.0, 50.0, 75.0);
assert!(!usage_safe.is_approaching_limit());
let usage_approaching = create_test_usage(25.0, 85.0, 75.0);
assert!(usage_approaching.is_approaching_limit());
}
#[test]
fn test_is_at_limit() {
let usage_safe = create_test_usage(25.0, 85.0, 75.0);
assert!(!usage_safe.is_at_limit());
let usage_at_limit = create_test_usage(25.0, 97.0, 75.0);
assert!(usage_at_limit.is_at_limit());
}
}