use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RouteConfig {
pub path: String,
pub method: String,
pub request: Option<RouteRequestConfig>,
pub response: RouteResponseConfig,
#[serde(default)]
pub fault_injection: Option<RouteFaultInjectionConfig>,
#[serde(default)]
pub latency: Option<RouteLatencyConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RouteRequestConfig {
pub validation: Option<RouteValidationConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RouteResponseConfig {
pub status: u16,
#[serde(default)]
pub headers: HashMap<String, String>,
pub body: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RouteValidationConfig {
pub schema: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RouteFaultInjectionConfig {
pub enabled: bool,
pub probability: f64,
pub fault_types: Vec<RouteFaultType>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum RouteFaultType {
HttpError {
status_code: u16,
message: Option<String>,
},
ConnectionError {
message: Option<String>,
},
Timeout {
duration_ms: u64,
message: Option<String>,
},
PartialResponse {
truncate_percent: f64,
},
PayloadCorruption {
corruption_type: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct RouteLatencyConfig {
pub enabled: bool,
pub probability: f64,
pub fixed_delay_ms: Option<u64>,
pub random_delay_range_ms: Option<(u64, u64)>,
pub jitter_percent: f64,
#[serde(default)]
pub distribution: LatencyDistribution,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case")]
#[derive(Default)]
pub enum LatencyDistribution {
#[default]
Fixed,
Normal {
mean_ms: f64,
std_dev_ms: f64,
},
Exponential {
lambda: f64,
},
Uniform,
}
impl Default for RouteFaultInjectionConfig {
fn default() -> Self {
Self {
enabled: false,
probability: 0.0,
fault_types: Vec::new(),
}
}
}
impl Default for RouteLatencyConfig {
fn default() -> Self {
Self {
enabled: false,
probability: 1.0,
fixed_delay_ms: None,
random_delay_range_ms: None,
jitter_percent: 0.0,
distribution: LatencyDistribution::Fixed,
}
}
}