mockforge_core/config/
routes.rs1use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
9pub struct RouteConfig {
10 pub path: String,
12 pub method: String,
14 pub request: Option<RouteRequestConfig>,
16 pub response: RouteResponseConfig,
18 #[serde(default)]
20 pub fault_injection: Option<RouteFaultInjectionConfig>,
21 #[serde(default)]
23 pub latency: Option<RouteLatencyConfig>,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize)]
28#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
29pub struct RouteRequestConfig {
30 pub validation: Option<RouteValidationConfig>,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
36#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
37pub struct RouteResponseConfig {
38 pub status: u16,
40 #[serde(default)]
42 pub headers: HashMap<String, String>,
43 pub body: Option<serde_json::Value>,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
49#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
50pub struct RouteValidationConfig {
51 pub schema: serde_json::Value,
53}
54
55#[derive(Debug, Clone, Serialize, Deserialize)]
57#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
58pub struct RouteFaultInjectionConfig {
59 pub enabled: bool,
61 pub probability: f64,
63 pub fault_types: Vec<RouteFaultType>,
65}
66
67#[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 HttpError {
74 status_code: u16,
76 message: Option<String>,
78 },
79 ConnectionError {
81 message: Option<String>,
83 },
84 Timeout {
86 duration_ms: u64,
88 message: Option<String>,
90 },
91 PartialResponse {
93 truncate_percent: f64,
95 },
96 PayloadCorruption {
98 corruption_type: String,
100 },
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize)]
105#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
106pub struct RouteLatencyConfig {
107 pub enabled: bool,
109 pub probability: f64,
111 pub fixed_delay_ms: Option<u64>,
113 pub random_delay_range_ms: Option<(u64, u64)>,
115 pub jitter_percent: f64,
117 #[serde(default)]
119 pub distribution: LatencyDistribution,
120}
121
122#[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 #[default]
130 Fixed,
131 Normal {
133 mean_ms: f64,
135 std_dev_ms: f64,
137 },
138 Exponential {
140 lambda: f64,
142 },
143 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}