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