1use std::time::Duration;
2
3use crate::{
4 error::BoxError,
5 memory::{AvailableMemory, Threshold},
6 service::MemoryLimit,
7};
8
9use tower_layer::Layer;
10
11#[derive(Debug, Clone)]
16pub struct MemoryLimitLayer<M>
17where
18 M: AvailableMemory,
19{
20 threshold: Threshold,
21 retry_interval: std::time::Duration,
25 provider: M,
27}
28
29impl<M> MemoryLimitLayer<M>
30where
31 M: AvailableMemory,
32{
33 pub fn available_memory(&self) -> Result<usize, BoxError> {
36 self.provider.available_memory()
37 }
38
39 pub const fn new(threshold: Threshold, provider: M) -> Self {
41 MemoryLimitLayer {
42 threshold,
43 provider,
44 retry_interval: std::time::Duration::from_millis(50),
45 }
46 }
47
48 pub fn with_retry_interval(self, retry_interval: Duration) -> Self {
50 MemoryLimitLayer {
51 threshold: self.threshold,
52 provider: self.provider,
53 retry_interval,
54 }
55 }
56}
57
58impl<S, M> Layer<S> for MemoryLimitLayer<M>
59where
60 M: AvailableMemory,
61{
62 type Service = MemoryLimit<S, M>;
63
64 fn layer(&self, service: S) -> Self::Service {
65 MemoryLimit::new(
66 service,
67 self.threshold.clone(),
68 self.provider.clone(),
69 self.retry_interval,
70 )
71 }
72}