1use std::{fmt, marker::PhantomData, time::Duration};
2
3use tower::{layer::Layer, Service};
4
5use super::{service::Batch, BatchControl};
6
7pub struct BatchLayer<Request> {
15 size: usize,
16 time: Duration,
17 _p: PhantomData<fn(Request)>,
18}
19
20impl<Request> BatchLayer<Request> {
21 #[must_use]
26 pub fn new(size: usize, time: Duration) -> Self {
27 Self {
28 size,
29 time,
30 _p: PhantomData,
31 }
32 }
33}
34
35impl<S, Request> Layer<S> for BatchLayer<Request>
36where
37 S: Service<BatchControl<Request>> + Send + 'static,
38 S::Future: Send,
39 S::Error: Into<crate::BoxError> + Send + Sync,
40 Request: Send + 'static,
41{
42 type Service = Batch<S, Request>;
43
44 fn layer(&self, service: S) -> Self::Service {
45 Batch::new(service, self.size, self.time)
46 }
47}
48
49impl<Request> fmt::Debug for BatchLayer<Request> {
50 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
51 f.debug_struct("BatchLayer")
52 .field("size", &self.size)
53 .field("time", &self.time)
54 .finish()
55 }
56}