use std::time::Duration;
use crate::wiremock::ResponseTemplate;
use crate::Config;
use super::ResponseAppender;
pub struct Delay<'a>(pub Option<u64>, pub &'a Option<RandomDelay>, pub &'a Config);
impl ResponseAppender for Delay<'_> {
fn add(&self, mut resp: ResponseTemplate) -> ResponseTemplate {
if let Some(global_delay) = self.2.global_delay {
resp = resp.set_delay(Duration::from_millis(global_delay))
} else if let Some(latency) = self.2.latency {
if let Some(delay) = self.0 {
resp = resp.set_delay(Duration::from_millis(latency + delay))
} else {
resp = resp.set_delay(Duration::from_millis(latency))
}
} else if let Some(delay) = self.0 {
resp = resp.set_delay(Duration::from_millis(delay))
} else if let Some(RandomDelay::Lognormal { median, sigma }) = self.1 {
resp = resp.set_lognormal_delay(*median, *sigma)
}
resp
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[serde(tag = "type")]
pub enum RandomDelay {
#[serde(rename = "lognormal")]
Lognormal { median: u64, sigma: f64 },
}