Skip to main content

mockforge_core/config/
routes.rs

1//! Route configuration types
2
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6/// Route configuration for custom HTTP routes
7#[derive(Debug, Clone, Serialize, Deserialize)]
8#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
9pub struct RouteConfig {
10    /// Route path (supports path parameters like /users/{id})
11    pub path: String,
12    /// HTTP method
13    pub method: String,
14    /// Request configuration
15    pub request: Option<RouteRequestConfig>,
16    /// Response configuration
17    pub response: RouteResponseConfig,
18    /// Per-route fault injection configuration
19    #[serde(default)]
20    pub fault_injection: Option<RouteFaultInjectionConfig>,
21    /// Per-route latency configuration
22    #[serde(default)]
23    pub latency: Option<RouteLatencyConfig>,
24}
25
26/// Request configuration for routes
27#[derive(Debug, Clone, Serialize, Deserialize)]
28#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
29pub struct RouteRequestConfig {
30    /// Request validation configuration
31    pub validation: Option<RouteValidationConfig>,
32}
33
34/// Response configuration for routes
35#[derive(Debug, Clone, Serialize, Deserialize)]
36#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
37pub struct RouteResponseConfig {
38    /// HTTP status code
39    pub status: u16,
40    /// Response headers
41    #[serde(default)]
42    pub headers: HashMap<String, String>,
43    /// Response body
44    pub body: Option<serde_json::Value>,
45}
46
47/// Validation configuration for routes
48#[derive(Debug, Clone, Serialize, Deserialize)]
49#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
50pub struct RouteValidationConfig {
51    /// JSON schema for request validation
52    pub schema: serde_json::Value,
53}
54
55/// Per-route fault injection configuration
56#[derive(Debug, Clone, Serialize, Deserialize)]
57#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
58pub struct RouteFaultInjectionConfig {
59    /// Enable fault injection for this route
60    pub enabled: bool,
61    /// Probability of injecting a fault (0.0-1.0)
62    pub probability: f64,
63    /// Fault types to inject
64    pub fault_types: Vec<RouteFaultType>,
65}
66
67/// Fault types that can be injected per route
68#[derive(Debug, Clone, Serialize, Deserialize)]
69#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
70#[serde(tag = "type", rename_all = "snake_case")]
71pub enum RouteFaultType {
72    /// HTTP error with status code
73    HttpError {
74        /// HTTP status code to return
75        status_code: u16,
76        /// Optional error message
77        message: Option<String>,
78    },
79    /// Connection error
80    ConnectionError {
81        /// Optional error message
82        message: Option<String>,
83    },
84    /// Timeout error
85    Timeout {
86        /// Timeout duration in milliseconds
87        duration_ms: u64,
88        /// Optional error message
89        message: Option<String>,
90    },
91    /// Partial response (truncate at percentage)
92    PartialResponse {
93        /// Percentage of response to truncate (0.0-100.0)
94        truncate_percent: f64,
95    },
96    /// Payload corruption
97    PayloadCorruption {
98        /// Type of corruption to apply
99        corruption_type: String,
100    },
101}
102
103/// Per-route latency configuration
104#[derive(Debug, Clone, Serialize, Deserialize)]
105#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
106pub struct RouteLatencyConfig {
107    /// Enable latency injection for this route
108    pub enabled: bool,
109    /// Probability of applying latency (0.0-1.0)
110    pub probability: f64,
111    /// Fixed delay in milliseconds
112    pub fixed_delay_ms: Option<u64>,
113    /// Random delay range (min_ms, max_ms)
114    pub random_delay_range_ms: Option<(u64, u64)>,
115    /// Jitter percentage (0.0-100.0)
116    pub jitter_percent: f64,
117    /// Latency distribution type
118    #[serde(default)]
119    pub distribution: LatencyDistribution,
120}
121
122/// Latency distribution type
123#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
124#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
125#[serde(rename_all = "snake_case")]
126#[derive(Default)]
127pub enum LatencyDistribution {
128    /// Fixed delay
129    #[default]
130    Fixed,
131    /// Normal distribution (requires mean and std_dev)
132    Normal {
133        /// Mean delay in milliseconds
134        mean_ms: f64,
135        /// Standard deviation in milliseconds
136        std_dev_ms: f64,
137    },
138    /// Exponential distribution (requires lambda)
139    Exponential {
140        /// Lambda parameter for exponential distribution
141        lambda: f64,
142    },
143    /// Uniform distribution (uses random_delay_range_ms)
144    Uniform,
145}
146
147impl Default for RouteFaultInjectionConfig {
148    fn default() -> Self {
149        Self {
150            enabled: false,
151            probability: 0.0,
152            fault_types: Vec::new(),
153        }
154    }
155}
156
157impl Default for RouteLatencyConfig {
158    fn default() -> Self {
159        Self {
160            enabled: false,
161            probability: 1.0,
162            fixed_delay_ms: None,
163            random_delay_range_ms: None,
164            jitter_percent: 0.0,
165            distribution: LatencyDistribution::Fixed,
166        }
167    }
168}