use std::time::Duration;
use crate::{
error::BoxError,
memory::{AvailableMemory, Threshold},
service::MemoryLimit,
};
use tower_layer::Layer;
#[derive(Debug, Clone)]
pub struct MemoryLimitLayer<M>
where
M: AvailableMemory,
{
threshold: Threshold,
retry_interval: std::time::Duration,
provider: M,
}
impl<M> MemoryLimitLayer<M>
where
M: AvailableMemory,
{
pub fn available_memory(&self) -> Result<usize, BoxError> {
self.provider.available_memory()
}
pub const fn new(threshold: Threshold, provider: M) -> Self {
MemoryLimitLayer {
threshold,
provider,
retry_interval: std::time::Duration::from_millis(50),
}
}
pub fn with_retry_interval(self, retry_interval: Duration) -> Self {
MemoryLimitLayer {
threshold: self.threshold,
provider: self.provider,
retry_interval,
}
}
}
impl<S, M> Layer<S> for MemoryLimitLayer<M>
where
M: AvailableMemory,
{
type Service = MemoryLimit<S, M>;
fn layer(&self, service: S) -> Self::Service {
MemoryLimit::new(
service,
self.threshold.clone(),
self.provider.clone(),
self.retry_interval,
)
}
}