use crate::config::{HedgeConfig, HedgeConfigBuilder};
use crate::Hedge;
use std::time::Duration;
use tower_layer::Layer;
#[derive(Clone)]
pub struct HedgeLayer {
config: HedgeConfig,
}
impl HedgeLayer {
pub fn new(delay: Duration) -> Self {
Self::builder().delay(delay).build()
}
pub fn conservative() -> Self {
Self::builder()
.delay(Duration::from_millis(500))
.max_hedged_attempts(2)
.build()
}
pub fn standard() -> Self {
Self::builder()
.delay(Duration::from_millis(100))
.max_hedged_attempts(3)
.build()
}
pub fn aggressive() -> Self {
Self::builder()
.delay(Duration::from_millis(50))
.max_hedged_attempts(5)
.build()
}
pub fn builder() -> HedgeConfigBuilder {
HedgeConfigBuilder::new()
}
pub(crate) fn from_config(config: HedgeConfig) -> Self {
Self { config }
}
}
impl<S> Layer<S> for HedgeLayer {
type Service = Hedge<S>;
fn layer(&self, service: S) -> Self::Service {
Hedge::new(service, self.config.clone())
}
}