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
17pub trait Service<Request> {
19 type Response;
21
22 type Error;
24
25 type Future: Future<Output = Result<Self::Response, Self::Error>>;
27
28 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
86pub trait Wrap<S> {
88 type Service;
90
91 fn wrap(self, service: S) -> Self::Service;
93}