1use alloc::collections::BTreeMap;
17use alloc::string::String;
18use alloc::vec::Vec;
19
20use serde::Deserialize;
21
22use crate::lenient;
23
24pub type Extra = BTreeMap<String, serde_json::Value>;
26
27#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
30#[non_exhaustive]
31pub struct Usage {
32 #[serde(default, deserialize_with = "lenient::opt")]
34 pub five_hour: Option<Window>,
35 #[serde(default, deserialize_with = "lenient::opt")]
37 pub seven_day: Option<Window>,
38 #[serde(default, deserialize_with = "lenient::opt")]
40 pub seven_day_opus: Option<Window>,
41 #[serde(default, deserialize_with = "lenient::opt")]
43 pub seven_day_sonnet: Option<Window>,
44 #[serde(default, deserialize_with = "lenient::opt")]
46 pub seven_day_oauth_apps: Option<Window>,
47 #[serde(default, deserialize_with = "lenient::opt")]
50 pub extra_usage: Option<ExtraUsage>,
51 #[serde(default, deserialize_with = "lenient::list")]
54 pub limits: Vec<Limit>,
55 #[serde(flatten)]
57 pub extra: Extra,
58}
59
60#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
62#[non_exhaustive]
63pub struct Window {
64 #[serde(default, deserialize_with = "lenient::num")]
66 pub utilization: Option<f64>,
67 #[serde(default, deserialize_with = "lenient::opt")]
70 pub resets_at: Option<String>,
71 #[serde(flatten)]
73 pub extra: Extra,
74}
75
76#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
80#[non_exhaustive]
81pub struct ExtraUsage {
82 #[serde(default, deserialize_with = "lenient::opt")]
84 pub is_enabled: Option<bool>,
85 #[serde(default, deserialize_with = "lenient::num")]
87 pub monthly_limit: Option<f64>,
88 #[serde(default, deserialize_with = "lenient::num")]
90 pub used_credits: Option<f64>,
91 #[serde(default, deserialize_with = "lenient::num")]
93 pub utilization: Option<f64>,
94 #[serde(default, deserialize_with = "lenient::opt")]
96 pub currency: Option<String>,
97 #[serde(flatten)]
99 pub extra: Extra,
100}
101
102#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
104#[non_exhaustive]
105pub struct Limit {
106 #[serde(default, deserialize_with = "lenient::opt")]
108 pub kind: Option<String>,
109 #[serde(default, deserialize_with = "lenient::opt")]
111 pub group: Option<String>,
112 #[serde(default, deserialize_with = "lenient::num")]
114 pub utilization: Option<f64>,
115 #[serde(default, deserialize_with = "lenient::opt")]
117 pub resets_at: Option<String>,
118 #[serde(default, deserialize_with = "lenient::opt")]
120 pub is_active: Option<bool>,
121 #[serde(default, deserialize_with = "lenient::opt")]
123 pub scope: Option<LimitScope>,
124 #[serde(flatten)]
126 pub extra: Extra,
127}
128
129#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
131#[non_exhaustive]
132pub struct LimitScope {
133 #[serde(default, deserialize_with = "lenient::opt")]
135 pub model: Option<LimitModel>,
136 #[serde(flatten)]
138 pub extra: Extra,
139}
140
141#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
143#[non_exhaustive]
144pub struct LimitModel {
145 #[serde(default, deserialize_with = "lenient::opt")]
147 pub display_name: Option<String>,
148 #[serde(flatten)]
150 pub extra: Extra,
151}
152
153#[derive(Debug, Clone, PartialEq, Deserialize)]
155#[non_exhaustive]
156pub struct Profile {
157 pub account: Account,
159 #[serde(default, deserialize_with = "lenient::opt")]
161 pub organization: Option<Organization>,
162 #[serde(flatten)]
164 pub extra: Extra,
165}
166
167impl Profile {
168 pub fn plan(&self) -> Option<Plan> {
172 if self.account.has_claude_max == Some(true) {
173 Some(Plan::Max)
174 } else if self.account.has_claude_pro == Some(true) {
175 Some(Plan::Pro)
176 } else {
177 None
178 }
179 }
180}
181
182#[derive(Debug, Clone, Copy, PartialEq, Eq)]
184#[non_exhaustive]
185pub enum Plan {
186 Pro,
188 Max,
190}
191
192#[derive(Debug, Clone, PartialEq, Deserialize)]
194#[non_exhaustive]
195pub struct Account {
196 pub uuid: String,
198 #[serde(default, alias = "email_address", deserialize_with = "lenient::opt")]
200 pub email: Option<String>,
201 #[serde(default, deserialize_with = "lenient::opt")]
203 pub full_name: Option<String>,
204 #[serde(default, deserialize_with = "lenient::opt")]
206 pub display_name: Option<String>,
207 #[serde(default, deserialize_with = "lenient::opt")]
209 pub has_claude_max: Option<bool>,
210 #[serde(default, deserialize_with = "lenient::opt")]
212 pub has_claude_pro: Option<bool>,
213 #[serde(default, deserialize_with = "lenient::opt")]
215 pub created_at: Option<String>,
216 #[serde(flatten)]
218 pub extra: Extra,
219}
220
221#[derive(Debug, Clone, PartialEq, Deserialize)]
223#[non_exhaustive]
224pub struct Organization {
225 pub uuid: String,
227 #[serde(default, deserialize_with = "lenient::opt")]
229 pub name: Option<String>,
230 #[serde(default, deserialize_with = "lenient::opt")]
232 pub organization_type: Option<String>,
233 #[serde(default, deserialize_with = "lenient::opt")]
235 pub billing_type: Option<String>,
236 #[serde(default, deserialize_with = "lenient::opt")]
238 pub rate_limit_tier: Option<String>,
239 #[serde(default, deserialize_with = "lenient::opt")]
241 pub has_extra_usage_enabled: Option<bool>,
242 #[serde(default, deserialize_with = "lenient::opt")]
244 pub subscription_status: Option<String>,
245 #[serde(flatten)]
247 pub extra: Extra,
248}
249
250#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
253#[non_exhaustive]
254pub struct Roles {
255 #[serde(default, deserialize_with = "lenient::opt")]
257 pub organization_role: Option<String>,
258 #[serde(default, deserialize_with = "lenient::opt")]
260 pub workspace_role: Option<String>,
261 #[serde(default, deserialize_with = "lenient::opt")]
263 pub organization_name: Option<String>,
264 #[serde(flatten)]
266 pub extra: Extra,
267}
268
269#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
272#[non_exhaustive]
273pub struct PrepaidCredits {
274 #[serde(default, deserialize_with = "lenient::num")]
276 pub amount: Option<f64>,
277 #[serde(default, deserialize_with = "lenient::opt")]
279 pub currency: Option<String>,
280 #[serde(default, deserialize_with = "lenient::opt")]
282 pub auto_reload_settings: Option<AutoReload>,
283 #[serde(default, deserialize_with = "lenient::count")]
285 pub expiry_policy_months: Option<u32>,
286 #[serde(flatten)]
288 pub extra: Extra,
289}
290
291#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
293#[non_exhaustive]
294pub struct AutoReload {
295 #[serde(default, deserialize_with = "lenient::opt")]
297 pub enabled: Option<bool>,
298 #[serde(flatten)]
300 pub extra: Extra,
301}
302
303#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
308#[non_exhaustive]
309pub struct OverageSpendLimit {
310 #[serde(default, deserialize_with = "lenient::opt")]
312 pub is_enabled: Option<bool>,
313 #[serde(default, deserialize_with = "lenient::num")]
315 pub monthly_credit_limit: Option<f64>,
316 #[serde(default, deserialize_with = "lenient::opt")]
318 pub currency: Option<String>,
319 #[serde(default, deserialize_with = "lenient::num")]
321 pub used_credits: Option<f64>,
322 #[serde(default, deserialize_with = "lenient::opt")]
324 pub disabled_until: Option<String>,
325 #[serde(default, deserialize_with = "lenient::opt")]
327 pub disabled_reason: Option<String>,
328 #[serde(flatten)]
330 pub extra: Extra,
331}