iota_network_stack/callback/
service.rs1use std::task::{Context, Poll};
6
7use http::{Request, Response};
8use tower::Service;
9
10use super::{CallbackLayer, MakeCallbackHandler, ResponseFuture};
11
12#[derive(Debug, Clone, Copy)]
18pub struct Callback<S, M> {
19 pub(crate) inner: S,
20 pub(crate) make_callback_handler: M,
21}
22
23impl<S, M> Callback<S, M> {
24 pub fn new(inner: S, make_callback_handler: M) -> Self {
26 Self {
27 inner,
28 make_callback_handler,
29 }
30 }
31
32 pub fn layer(make_handler: M) -> CallbackLayer<M>
37 where
38 M: MakeCallbackHandler,
39 {
40 CallbackLayer::new(make_handler)
41 }
42
43 pub fn inner(&self) -> &S {
45 &self.inner
46 }
47
48 pub fn inner_mut(&mut self) -> &mut S {
50 &mut self.inner
51 }
52
53 pub fn into_inner(self) -> S {
55 self.inner
56 }
57}
58
59impl<S, M, RequestBody, ResponseBody> Service<Request<RequestBody>> for Callback<S, M>
60where
61 S: Service<Request<RequestBody>, Response = Response<ResponseBody>>,
62 M: MakeCallbackHandler,
63{
64 type Response = Response<ResponseBody>;
65 type Error = S::Error;
66 type Future = ResponseFuture<S::Future, M::Handler>;
67
68 fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
69 self.inner.poll_ready(cx)
70 }
71
72 fn call(&mut self, request: Request<RequestBody>) -> Self::Future {
73 let (head, body) = request.into_parts();
74 let handler = self.make_callback_handler.make_handler(&head);
75 let request = Request::from_parts(head, body);
76
77 ResponseFuture {
78 inner: self.inner.call(request),
79 handler: Some(handler),
80 }
81 }
82}