use crate::constants::FastHashMap;
use crate::models::Provider;
use serde::Serialize;
pub type UsageResult = FastHashMap<String, serde_json::Value>;
#[derive(Debug, Clone, Default, Serialize)]
pub struct ProviderActiveDays {
pub claude: usize,
pub codex: usize,
pub copilot: usize,
pub gemini: usize,
pub opencode: usize,
pub cursor: usize,
pub hermes: usize,
pub grok: usize,
pub total: usize,
}
#[derive(Debug, Default, Clone, Serialize)]
pub struct PerProviderUsage {
pub claude: UsageResult,
pub codex: UsageResult,
pub copilot: UsageResult,
pub gemini: UsageResult,
pub opencode: UsageResult,
pub cursor: UsageResult,
pub hermes: UsageResult,
pub grok: UsageResult,
}
impl PerProviderUsage {
pub fn get(&self, provider: Provider) -> Option<&UsageResult> {
match provider {
Provider::ClaudeCode => Some(&self.claude),
Provider::Codex => Some(&self.codex),
Provider::Copilot => Some(&self.copilot),
Provider::Gemini => Some(&self.gemini),
Provider::OpenCode => Some(&self.opencode),
Provider::Cursor => Some(&self.cursor),
Provider::Hermes => Some(&self.hermes),
Provider::Grok => Some(&self.grok),
Provider::Unknown => None,
}
}
pub fn get_mut(&mut self, provider: Provider) -> Option<&mut UsageResult> {
match provider {
Provider::ClaudeCode => Some(&mut self.claude),
Provider::Codex => Some(&mut self.codex),
Provider::Copilot => Some(&mut self.copilot),
Provider::Gemini => Some(&mut self.gemini),
Provider::OpenCode => Some(&mut self.opencode),
Provider::Cursor => Some(&mut self.cursor),
Provider::Hermes => Some(&mut self.hermes),
Provider::Grok => Some(&mut self.grok),
Provider::Unknown => None,
}
}
}