service_layer_rs/lib.rs
1//! Service Layer
2//!
3
4//! # Example
5//!
6//! ```rust
7//! use service_layer_rs::util::FnService;
8//! use service_layer_rs::{Layer, Service, ServiceBuilder};
9//! use std::convert::Infallible;
10//!
11//! pub struct LogService<S> {
12//! inner: S,
13//! name: String,
14//! }
15//!
16//! impl<S, Request> Service<Request> for LogService<S>
17//! where
18//! S: Service<Request>,
19//! Request: Send + 'static,
20//! {
21//! type Response = S::Response;
22//! type Error = S::Error;
23//!
24//! async fn call(
25//! &self,
26//! request: Request,
27//! ) -> Result<Self::Response, Self::Error> {
28//! println!("LogService<{}> start", self.name);
29//! let res = self.inner.call(request).await;
30//! println!("LogService<{}> end", self.name);
31//! res
32//! }
33//! }
34//!
35//! pub struct LogLayer(pub String);
36//!
37//! impl<S> Layer<S> for LogLayer
38//! where
39//! S: Send + Sync + 'static
40//! {
41//! type Service = LogService<S>;
42//!
43//! fn layer(self, inner: S) -> Self::Service {
44//! LogService { inner, name: self.0 }
45//! }
46//! }
47//!
48//! async fn main() {
49//! let svc = FnService::new(|request: String| async move {
50//! println!("handle: {}", request);
51//! Ok::<_, Infallible>(request)
52//! });
53//!
54//! let svc = ServiceBuilder::service(svc)
55//! .layer(LogLayer("Test".to_string()))
56//! .build();
57//!
58//! let ss = svc.boxed();
59//! let res: Result<String, Infallible> = ss.call("hello".to_owned()).await;
60//! println!("{:?}", res);
61//! }
62//! ```
63
64pub mod service;
65pub mod util;
66
67pub use service::{BoxService, Service};
68
69/// Decorates a Service
70pub trait Layer<S> {
71 /// The wrapped service
72 type Service;
73 /// Wrap the given service with the middleware, returning a new service that has been decorated with the middleware.
74 fn layer(self, inner: S) -> Self::Service;
75}
76
77/// Builder types to compose layers and services
78pub struct ServiceBuilder<S> {
79 inner: S,
80}
81
82impl<S> ServiceBuilder<S> {
83 pub fn service<Request>(inner: S) -> Self
84 where
85 S: Service<Request>,
86 {
87 ServiceBuilder { inner }
88 }
89
90 pub fn layer<L, T, Request>(self, l: L) -> ServiceBuilder<T>
91 where
92 S: Service<Request>,
93 T: Service<Request>,
94 L: Layer<S, Service=T>,
95 {
96 let inner = l.layer(self.inner);
97 ServiceBuilder { inner }
98 }
99
100 pub fn build<Request>(self) -> S
101 where
102 S: Service<Request>,
103 {
104 self.inner
105 }
106
107 pub async fn call<Request>(self, request: Request) -> Result<S::Response, S::Error>
108 where
109 S: Service<Request>,
110 {
111 self.inner.call(request).await
112 }
113}