iota_network_stack/callback/
service.rs1use std::task::{Context, Poll};
6
7use http::{Request, Response};
8use tower::Service;
9
10use super::{CallbackLayer, MakeCallbackHandler, ResponseBody, 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, ResponseBodyT> Service<Request<RequestBody>> for Callback<S, M>
60where
61 S: Service<
62 Request<RequestBody>,
63 Response = Response<ResponseBodyT>,
64 Error: std::fmt::Display + 'static,
65 >,
66 M: MakeCallbackHandler,
67 RequestBody: http_body::Body<Error: std::fmt::Display + 'static>,
68 ResponseBodyT: http_body::Body<Error: std::fmt::Display + 'static>,
69{
70 type Response = Response<ResponseBody<ResponseBodyT, M::Handler>>;
71 type Error = S::Error;
72 type Future = ResponseFuture<S::Future, M::Handler>;
73
74 fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
75 self.inner.poll_ready(cx)
76 }
77
78 fn call(&mut self, request: Request<RequestBody>) -> Self::Future {
79 let (head, body) = request.into_parts();
80 let handler = self.make_callback_handler.make_handler(&head);
81 let request = Request::from_parts(head, body);
82
83 ResponseFuture {
84 inner: self.inner.call(request),
85 handler: Some(handler),
86 }
87 }
88}