use crate::middleware::{AuthConfig, RateLimitConfig};
use std::net::SocketAddr;
use std::time::Duration;
#[cfg(feature = "inference")]
use attuned_infer::InferenceConfig;
#[derive(Clone, Debug)]
pub struct ServerConfig {
pub bind_addr: SocketAddr,
pub request_timeout: Duration,
pub body_limit: usize,
pub cors_origins: Vec<String>,
pub auth: AuthConfig,
pub rate_limit: RateLimitConfig,
pub security_headers: bool,
#[cfg(feature = "inference")]
pub enable_inference: bool,
#[cfg(feature = "inference")]
pub inference_config: Option<InferenceConfig>,
}
impl Default for ServerConfig {
fn default() -> Self {
Self {
bind_addr: "127.0.0.1:8080".parse().unwrap(),
request_timeout: Duration::from_secs(30),
body_limit: 1024 * 1024, cors_origins: vec![],
auth: AuthConfig::default(),
rate_limit: RateLimitConfig::default(),
security_headers: true,
#[cfg(feature = "inference")]
enable_inference: false,
#[cfg(feature = "inference")]
inference_config: None,
}
}
}
impl ServerConfig {
pub fn with_api_keys(mut self, keys: impl IntoIterator<Item = String>) -> Self {
self.auth = AuthConfig::with_keys(keys);
self
}
pub fn without_rate_limit(mut self) -> Self {
self.rate_limit.max_requests = u32::MAX;
self
}
pub fn with_rate_limit(mut self, max_requests: u32, window_secs: u64) -> Self {
self.rate_limit.max_requests = max_requests;
self.rate_limit.window = Duration::from_secs(window_secs);
self
}
#[cfg(feature = "inference")]
pub fn with_inference(mut self) -> Self {
self.enable_inference = true;
self
}
#[cfg(feature = "inference")]
pub fn with_inference_config(mut self, config: InferenceConfig) -> Self {
self.enable_inference = true;
self.inference_config = Some(config);
self
}
}