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}