use crate::config::ApiKeyConfig;
use anyhow::Result;
use async_trait::async_trait;
#[derive(Debug, Clone)]
pub struct ApiKeyState {
pub index: usize,
pub value: String,
pub label: Option<String>,
pub enabled: bool,
pub failed: bool,
pub usage_count: u64,
}
impl From<(usize, &ApiKeyConfig)> for ApiKeyState {
fn from((index, cfg): (usize, &ApiKeyConfig)) -> Self {
Self {
index,
value: cfg.value.clone(),
label: cfg.label.clone(),
enabled: cfg.enabled,
failed: false,
usage_count: 0,
}
}
}
#[async_trait]
pub trait KeySelectorLayer: Send + Sync {
async fn select(&self, provider: &str, keys: &[ApiKeyState]) -> Result<usize>;
fn mark_failed(&self, provider: &str, index: usize);
fn mark_success(&self, provider: &str, index: usize);
}