use alloc::collections::BTreeMap;
use alloc::string::String;
use alloc::vec::Vec;
use serde::Deserialize;
use crate::lenient;
pub type Extra = BTreeMap<String, serde_json::Value>;
#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
#[non_exhaustive]
pub struct Usage {
#[serde(default, deserialize_with = "lenient::opt")]
pub five_hour: Option<Window>,
#[serde(default, deserialize_with = "lenient::opt")]
pub seven_day: Option<Window>,
#[serde(default, deserialize_with = "lenient::opt")]
pub seven_day_opus: Option<Window>,
#[serde(default, deserialize_with = "lenient::opt")]
pub seven_day_sonnet: Option<Window>,
#[serde(default, deserialize_with = "lenient::opt")]
pub seven_day_oauth_apps: Option<Window>,
#[serde(default, deserialize_with = "lenient::opt")]
pub extra_usage: Option<ExtraUsage>,
#[serde(default, deserialize_with = "lenient::list")]
pub limits: Vec<Limit>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
#[non_exhaustive]
pub struct Window {
#[serde(default, deserialize_with = "lenient::num")]
pub utilization: Option<f64>,
#[serde(default, deserialize_with = "lenient::opt")]
pub resets_at: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
#[non_exhaustive]
pub struct ExtraUsage {
#[serde(default, deserialize_with = "lenient::opt")]
pub is_enabled: Option<bool>,
#[serde(default, deserialize_with = "lenient::num")]
pub monthly_limit: Option<f64>,
#[serde(default, deserialize_with = "lenient::num")]
pub used_credits: Option<f64>,
#[serde(default, deserialize_with = "lenient::num")]
pub utilization: Option<f64>,
#[serde(default, deserialize_with = "lenient::opt")]
pub currency: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
#[non_exhaustive]
pub struct Limit {
#[serde(default, deserialize_with = "lenient::opt")]
pub kind: Option<String>,
#[serde(default, deserialize_with = "lenient::opt")]
pub group: Option<String>,
#[serde(default, deserialize_with = "lenient::num")]
pub utilization: Option<f64>,
#[serde(default, deserialize_with = "lenient::opt")]
pub resets_at: Option<String>,
#[serde(default, deserialize_with = "lenient::opt")]
pub is_active: Option<bool>,
#[serde(default, deserialize_with = "lenient::opt")]
pub scope: Option<LimitScope>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
#[non_exhaustive]
pub struct LimitScope {
#[serde(default, deserialize_with = "lenient::opt")]
pub model: Option<LimitModel>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
#[non_exhaustive]
pub struct LimitModel {
#[serde(default, deserialize_with = "lenient::opt")]
pub display_name: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[non_exhaustive]
pub struct Profile {
pub account: Account,
#[serde(default, deserialize_with = "lenient::opt")]
pub organization: Option<Organization>,
#[serde(flatten)]
pub extra: Extra,
}
impl Profile {
pub fn plan(&self) -> Option<Plan> {
if self.account.has_claude_max == Some(true) {
Some(Plan::Max)
} else if self.account.has_claude_pro == Some(true) {
Some(Plan::Pro)
} else {
None
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Plan {
Pro,
Max,
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[non_exhaustive]
pub struct Account {
pub uuid: String,
#[serde(default, alias = "email_address", deserialize_with = "lenient::opt")]
pub email: Option<String>,
#[serde(default, deserialize_with = "lenient::opt")]
pub full_name: Option<String>,
#[serde(default, deserialize_with = "lenient::opt")]
pub display_name: Option<String>,
#[serde(default, deserialize_with = "lenient::opt")]
pub has_claude_max: Option<bool>,
#[serde(default, deserialize_with = "lenient::opt")]
pub has_claude_pro: Option<bool>,
#[serde(default, deserialize_with = "lenient::opt")]
pub created_at: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[non_exhaustive]
pub struct Organization {
pub uuid: String,
#[serde(default, deserialize_with = "lenient::opt")]
pub name: Option<String>,
#[serde(default, deserialize_with = "lenient::opt")]
pub organization_type: Option<String>,
#[serde(default, deserialize_with = "lenient::opt")]
pub billing_type: Option<String>,
#[serde(default, deserialize_with = "lenient::opt")]
pub rate_limit_tier: Option<String>,
#[serde(default, deserialize_with = "lenient::opt")]
pub has_extra_usage_enabled: Option<bool>,
#[serde(default, deserialize_with = "lenient::opt")]
pub subscription_status: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
#[non_exhaustive]
pub struct Roles {
#[serde(default, deserialize_with = "lenient::opt")]
pub organization_role: Option<String>,
#[serde(default, deserialize_with = "lenient::opt")]
pub workspace_role: Option<String>,
#[serde(default, deserialize_with = "lenient::opt")]
pub organization_name: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
#[non_exhaustive]
pub struct PrepaidCredits {
#[serde(default, deserialize_with = "lenient::num")]
pub amount: Option<f64>,
#[serde(default, deserialize_with = "lenient::opt")]
pub currency: Option<String>,
#[serde(default, deserialize_with = "lenient::opt")]
pub auto_reload_settings: Option<AutoReload>,
#[serde(default, deserialize_with = "lenient::count")]
pub expiry_policy_months: Option<u32>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
#[non_exhaustive]
pub struct AutoReload {
#[serde(default, deserialize_with = "lenient::opt")]
pub enabled: Option<bool>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Default, PartialEq, Deserialize)]
#[non_exhaustive]
pub struct OverageSpendLimit {
#[serde(default, deserialize_with = "lenient::opt")]
pub is_enabled: Option<bool>,
#[serde(default, deserialize_with = "lenient::num")]
pub monthly_credit_limit: Option<f64>,
#[serde(default, deserialize_with = "lenient::opt")]
pub currency: Option<String>,
#[serde(default, deserialize_with = "lenient::num")]
pub used_credits: Option<f64>,
#[serde(default, deserialize_with = "lenient::opt")]
pub disabled_until: Option<String>,
#[serde(default, deserialize_with = "lenient::opt")]
pub disabled_reason: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}