micro_tower/
builder.rs

1//! Extensions to improve [`tower::ServiceBuilder`].
2
3use tower::layer::util::Stack;
4use tower::ServiceBuilder;
5
6use crate::api;
7use crate::service::pool;
8
9pub trait ServiceBuilderExt<L> {
10    /// Wrap service in [`api::Layer`]. Should be done to prepare service for sessions (e.g.
11    /// [`crate::session::tcp::spawn`]).
12    fn api<R, C>(self) -> ServiceBuilder<Stack<api::Layer<R, C>, L>>;
13}
14
15pub trait ServicePoolBuilderExt<L> {
16    /// Wraps the make service to create a pool with `count` many services.
17    fn pooled<T, Req>(
18        self,
19        count: usize,
20        target: T,
21    ) -> ServiceBuilder<Stack<pool::Layer<T, Req>, L>>;
22}
23
24impl<L> ServiceBuilderExt<L> for ServiceBuilder<L> {
25    fn api<R, C>(self) -> ServiceBuilder<Stack<api::Layer<R, C>, L>> {
26        self.layer(api::Layer::default())
27    }
28}
29
30impl<L> ServicePoolBuilderExt<L> for ServiceBuilder<L> {
31    fn pooled<T, Req>(
32        self,
33        count: usize,
34        target: T,
35    ) -> ServiceBuilder<Stack<pool::Layer<T, Req>, L>> {
36        self.layer(pool::Layer::with_size(count, target))
37    }
38}