Skip to main content

seher/claude/
types.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Deserialize, Serialize)]
5pub struct UsageWindow {
6    pub utilization: f64,
7    pub resets_at: Option<DateTime<Utc>>,
8}
9
10#[derive(Debug, Deserialize, Serialize)]
11pub struct UsageResponse {
12    pub five_hour: Option<UsageWindow>,
13    pub seven_day: Option<UsageWindow>,
14    pub seven_day_sonnet: Option<UsageWindow>,
15    pub seven_day_oauth_apps: Option<UsageWindow>,
16    pub seven_day_opus: Option<UsageWindow>,
17    pub seven_day_cowork: Option<UsageWindow>,
18    pub iguana_necktie: Option<UsageWindow>,
19    pub extra_usage: Option<UsageWindow>,
20}
21
22impl UsageResponse {
23    /// Returns all present windows as `(name, &UsageWindow)` pairs.
24    #[must_use]
25    pub fn all_windows(&self) -> Vec<(&str, &UsageWindow)> {
26        [
27            ("five_hour", self.five_hour.as_ref()),
28            ("seven_day", self.seven_day.as_ref()),
29            ("seven_day_sonnet", self.seven_day_sonnet.as_ref()),
30            ("seven_day_oauth_apps", self.seven_day_oauth_apps.as_ref()),
31            ("seven_day_opus", self.seven_day_opus.as_ref()),
32            ("seven_day_cowork", self.seven_day_cowork.as_ref()),
33            ("iguana_necktie", self.iguana_necktie.as_ref()),
34            ("extra_usage", self.extra_usage.as_ref()),
35        ]
36        .into_iter()
37        .filter_map(|(name, w)| w.map(|w| (name, w)))
38        .collect()
39    }
40
41    #[must_use]
42    pub fn next_reset_time(&self) -> Option<chrono::DateTime<Utc>> {
43        self.all_windows()
44            .into_iter()
45            .filter(|(_, w)| w.utilization >= 100.0)
46            .filter_map(|(_, w)| w.resets_at)
47            .max()
48    }
49}