use std::fmt::Debug;
use crate::core::net::ProviderEndpointAccess;
pub trait ProviderConfig: Send + Sync + Clone + Debug + 'static {
fn validate(&self) -> Result<(), String>;
fn api_key(&self) -> Option<&str>;
fn api_base(&self) -> Option<&str>;
fn timeout(&self) -> std::time::Duration;
fn max_retries(&self) -> u32;
fn endpoint_access(&self) -> ProviderEndpointAccess {
ProviderEndpointAccess::PublicOnly
}
fn use_ssrf_safe_client(&self) -> bool {
false
}
fn validate_standard(&self, provider_name: &str) -> Result<(), String> {
if self.api_key().is_none_or(|k| k.is_empty()) {
return Err(format!("{} API key is required", provider_name));
}
if self.timeout().as_secs() == 0 {
return Err("Timeout must be greater than 0".to_string());
}
if self.max_retries() > 10 {
return Err("Max retries should not exceed 10".to_string());
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::ProviderConfig;
use crate::core::net::ProviderEndpointAccess;
use crate::core::providers::mistral::MistralConfig;
#[test]
fn endpoint_access_defaults_to_public_only() {
assert_eq!(
MistralConfig::default().endpoint_access(),
ProviderEndpointAccess::PublicOnly
);
}
}