use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MiddlewareConfig {
pub auth: Option<AuthConfig>,
pub cors: Option<CorsConfig>,
pub logging: Option<LoggingConfig>,
pub compression: Option<CompressionConfig>,
pub rate_limit: Option<RateLimitConfig>,
pub timeout: Option<TimeoutConfig>,
pub custom: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthConfig {
pub enabled: bool,
pub jwt_secret: Option<String>,
pub jwt_issuer: Option<String>,
pub jwt_audience: Option<String>,
pub token_expiration: Duration,
pub api_key_endpoint: Option<String>,
pub default_permissions: Vec<String>,
pub admin_keys: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CorsConfig {
pub enabled: bool,
pub allowed_origins: Vec<String>,
pub allowed_methods: Vec<String>,
pub allowed_headers: Vec<String>,
pub exposed_headers: Vec<String>,
pub allow_credentials: bool,
pub max_age: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LoggingConfig {
pub enabled: bool,
pub level: LogLevel,
pub include_body: bool,
pub include_response: bool,
pub include_headers: bool,
pub exclude_paths: Vec<String>,
pub format: LogFormat,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum LogLevel {
Trace,
Debug,
Info,
Warn,
Error,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum LogFormat {
Json,
Text,
Combined,
Common,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompressionConfig {
pub enabled: bool,
pub algorithms: Vec<CompressionAlgorithm>,
pub min_size: usize,
pub level: u32,
pub content_types: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum CompressionAlgorithm {
Gzip,
Deflate,
Brotli,
Zstd,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RateLimitConfig {
pub enabled: bool,
pub default_limits: RateLimits,
pub client_limits: HashMap<String, RateLimits>,
pub storage: RateLimitStorage,
pub include_headers: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RateLimits {
pub requests_per_minute: u32,
pub requests_per_hour: u32,
pub tokens_per_minute: u32,
pub tokens_per_hour: u32,
pub concurrent_requests: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum RateLimitStorage {
Memory,
Redis,
Database,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeoutConfig {
pub enabled: bool,
pub request_timeout: Duration,
pub keep_alive_timeout: Duration,
pub read_timeout: Duration,
pub write_timeout: Duration,
}
impl Default for AuthConfig {
fn default() -> Self {
Self {
enabled: false,
jwt_secret: None,
jwt_issuer: Some("ferrum-infer".to_string()),
jwt_audience: Some("ferrum-api".to_string()),
token_expiration: Duration::from_secs(3600),
api_key_endpoint: None,
default_permissions: vec![],
admin_keys: vec![],
}
}
}
impl Default for CorsConfig {
fn default() -> Self {
Self {
enabled: true,
allowed_origins: vec!["*".to_string()],
allowed_methods: vec!["GET".to_string(), "POST".to_string(), "OPTIONS".to_string()],
allowed_headers: vec![
"Content-Type".to_string(),
"Authorization".to_string(),
"X-Requested-With".to_string(),
],
exposed_headers: vec![],
allow_credentials: false,
max_age: Duration::from_secs(86400),
}
}
}
impl Default for LoggingConfig {
fn default() -> Self {
Self {
enabled: true,
level: LogLevel::Info,
include_body: false,
include_response: false,
include_headers: false,
exclude_paths: vec!["/health".to_string(), "/metrics".to_string()],
format: LogFormat::Json,
}
}
}
impl Default for CompressionConfig {
fn default() -> Self {
Self {
enabled: true,
algorithms: vec![CompressionAlgorithm::Gzip, CompressionAlgorithm::Deflate],
min_size: 1024,
level: 6,
content_types: vec![
"application/json".to_string(),
"text/plain".to_string(),
"text/html".to_string(),
],
}
}
}
impl Default for RateLimitConfig {
fn default() -> Self {
Self {
enabled: false,
default_limits: RateLimits::default(),
client_limits: HashMap::new(),
storage: RateLimitStorage::Memory,
include_headers: true,
}
}
}
impl Default for RateLimits {
fn default() -> Self {
Self {
requests_per_minute: 60,
requests_per_hour: 1000,
tokens_per_minute: 10000,
tokens_per_hour: 100000,
concurrent_requests: 10,
}
}
}
impl Default for TimeoutConfig {
fn default() -> Self {
Self {
enabled: true,
request_timeout: Duration::from_secs(30),
keep_alive_timeout: Duration::from_secs(60),
read_timeout: Duration::from_secs(10),
write_timeout: Duration::from_secs(10),
}
}
}