mod env_source;
pub use env_source::EnvCredentialSource;
use crate::capabilities::ProviderKind;
use chrono::{DateTime, Utc};
use zeroize::ZeroizeOnDrop;
#[derive(Clone, ZeroizeOnDrop)]
pub struct Credential {
pub api_key: String,
#[zeroize(skip)]
pub base_url: Option<String>,
#[zeroize(skip)]
pub expires_at: Option<DateTime<Utc>>,
}
impl std::fmt::Debug for Credential {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Credential")
.field("api_key", &"[REDACTED]")
.field("base_url", &self.base_url)
.field("expires_at", &self.expires_at)
.finish()
}
}
#[derive(Debug, thiserror::Error)]
pub enum CredError {
#[error("missing credential for provider {0:?}")]
Missing(ProviderKind),
#[error("credential expired for provider {0:?}")]
Expired(ProviderKind),
#[error(transparent)]
Other(#[from] anyhow::Error),
}
#[async_trait::async_trait]
pub trait CredentialSource: Send + Sync {
async fn get_credential(&self, provider: ProviderKind) -> Result<Credential, CredError>;
async fn invalidate(&self, _provider: ProviderKind) -> Result<(), CredError> {
Ok(())
}
}