use async_trait::async_trait;
use crate::error::ProviderError;
#[async_trait]
pub trait KeySource: Send + Sync {
async fn get_api_key(&self) -> Result<String, ProviderError>;
}
#[cfg(test)]
mod tests {
use super::*;
struct TestSource {
key: String,
}
#[async_trait]
impl KeySource for TestSource {
async fn get_api_key(&self) -> Result<String, ProviderError> {
Ok(self.key.clone())
}
}
#[tokio::test]
async fn trait_is_object_safe() {
use std::sync::Arc;
let source: Arc<dyn KeySource> = Arc::new(TestSource { key: "sk-test".into() });
let api_key = source.get_api_key().await.ok();
assert_eq!(api_key.as_deref(), Some("sk-test"));
}
struct ErrSource;
#[async_trait]
impl KeySource for ErrSource {
async fn get_api_key(&self) -> Result<String, ProviderError> {
Err(ProviderError::KeySource("test error".into()))
}
}
#[tokio::test]
async fn trait_returns_error() {
let source = ErrSource;
assert!(source.get_api_key().await.is_err());
}
}