puzz_service/
lib.rs

1#![no_std]
2#![forbid(unsafe_code)]
3
4#[cfg(feature = "alloc")]
5extern crate alloc;
6
7use core::future::Future;
8
9#[macro_use]
10mod macros;
11
12#[cfg(feature = "util")]
13pub mod util;
14#[cfg(feature = "util")]
15pub use util::ServiceExt;
16
17/// 请求响应模型,表示一个接收请求并返回响应的异步函数。
18pub trait Service<Request> {
19    /// 服务返回的响应。
20    type Response;
21
22    /// 服务产生的错误。
23    type Error;
24
25    /// 异步返回的响应。
26    type Future: Future<Output = Result<Self::Response, Self::Error>>;
27
28    /// 处理请求并异步返回响应。
29    fn call(&self, request: Request) -> Self::Future;
30}
31
32impl<'a, S, Request> Service<Request> for &'a mut S
33where
34    S: Service<Request> + ?Sized + 'a,
35{
36    type Response = S::Response;
37    type Error = S::Error;
38    type Future = S::Future;
39
40    fn call(&self, request: Request) -> Self::Future {
41        (**self).call(request)
42    }
43}
44
45impl<'a, S, Request> Service<Request> for &'a S
46where
47    S: Service<Request> + ?Sized + 'a,
48{
49    type Response = S::Response;
50    type Error = S::Error;
51    type Future = S::Future;
52
53    fn call(&self, request: Request) -> Self::Future {
54        (**self).call(request)
55    }
56}
57
58#[cfg(feature = "alloc")]
59impl<S, Request> Service<Request> for alloc::boxed::Box<S>
60where
61    S: Service<Request> + ?Sized,
62{
63    type Response = S::Response;
64    type Error = S::Error;
65    type Future = S::Future;
66
67    fn call(&self, request: Request) -> Self::Future {
68        (**self).call(request)
69    }
70}
71
72#[cfg(feature = "alloc")]
73impl<S, Request> Service<Request> for alloc::rc::Rc<S>
74where
75    S: Service<Request> + ?Sized,
76{
77    type Response = S::Response;
78    type Error = S::Error;
79    type Future = S::Future;
80
81    fn call(&self, request: Request) -> Self::Future {
82        (**self).call(request)
83    }
84}
85
86/// 包裹服务,转换服务的请求和响应。
87pub trait Wrap<S> {
88    /// 包裹后的服务。
89    type Service;
90
91    /// 包裹给定的服务,返回一个包裹后的新服务。
92    fn wrap(self, service: S) -> Self::Service;
93}