use std::sync::Arc;
use crate::token_maxing::{
Availability, CooldownRecord, MaxerStatus, MaxingStart, ProviderSnapshot, QuotaTracker,
QuotaTrackerSnapshot, RecalibrationRecord, TokenMaxer, TokenMaxingConfig, TokenMaxingSession,
};
pub struct TokenMaxingApi {
tracker: Arc<QuotaTracker>,
maxer: Arc<TokenMaxer>,
}
impl TokenMaxingApi {
pub fn new(tracker: Arc<QuotaTracker>, maxer: Arc<TokenMaxer>) -> Self {
Self { tracker, maxer }
}
pub fn tracker(&self) -> &Arc<QuotaTracker> {
&self.tracker
}
pub fn maxer(&self) -> &Arc<TokenMaxer> {
&self.maxer
}
pub fn launch(&self, start: MaxingStart) -> anyhow::Result<String> {
self.maxer.launch(start)
}
pub fn stop(&self) {
self.maxer.stop();
}
pub fn status(&self) -> MaxerStatus {
self.maxer.status()
}
pub fn sessions(&self) -> Vec<TokenMaxingSession> {
self.maxer.sessions()
}
pub fn session(&self, id: &str) -> Option<TokenMaxingSession> {
self.maxer.session(id)
}
pub fn enabled(&self) -> bool {
let cfg = self.tracker.config();
cfg.enabled && cfg.providers.iter().any(|p| cfg.is_eligible(&p.provider))
}
pub fn config(&self) -> TokenMaxingConfig {
self.tracker.config()
}
pub fn reload(&self, config: TokenMaxingConfig) {
self.tracker.reload(config);
}
pub fn availability(&self, provider: &str) -> Availability {
self.tracker.availability(provider)
}
pub fn snapshots(&self) -> Vec<QuotaTrackerSnapshot> {
self.tracker.snapshots()
}
pub fn snapshot(&self, provider: &str) -> Option<ProviderSnapshot> {
self.tracker.snapshot(provider)
}
pub fn recalibration_history(&self) -> Vec<RecalibrationRecord> {
self.tracker.recalibration_history()
}
pub fn cooldown_history(&self) -> Vec<CooldownRecord> {
self.tracker.cooldown_history()
}
}