rktk_rrp/macros/
server.rs

1macro_rules! gen_ep_sig {
2    ($ep:ident, normal: $ty_req:ty, normal: $ty_res:ty) => {
3        async fn $ep(&mut self, _req: $ty_req) -> Result<$ty_res, Self::Error> {
4            Err(Self::Error::default())
5        }
6    };
7    ($ep:ident, normal: $ty_req:ty, stream: $ty_res:ty) => {
8        async fn $ep(&mut self, _req: $ty_req) -> Result<impl Stream<Item = $ty_res>, Self::Error> {
9            Result::<Empty<_>, _>::Err(Self::Error::default())
10        }
11    };
12    ($ep:ident, stream: $ty_req:ty, normal: $ty_res:ty) => {
13        async fn $ep(
14            &mut self,
15            _req: impl Stream<Item = Result<$ty_req, ReceiveError<RE>>>,
16        ) -> Result<$ty_res, Self::Error> {
17            Err(Self::Error::default())
18        }
19    };
20    ($ep:ident, stream: $ty_req:ty, stream: $ty_res:ty) => {
21        async fn $ep(
22            &mut self,
23            _req: impl Stream<Item = Result<$ty_req, ReceiveError<RE>>>,
24        ) -> Result<impl Stream<Item = $ty_res>, Self::Error> {
25            Result::<Empty<_>, _>::Err(Self::Error::default())
26        }
27    };
28}
29pub(crate) use gen_ep_sig;
30
31macro_rules! recv_request_body {
32    (normal, $reader:expr) => {
33        $reader.recv_body_normal::<_, BUF_SIZE>().await?
34    };
35    (stream, $reader:expr) => {
36        $reader.recv_body_stream::<_, BUF_SIZE>().await
37    };
38}
39pub(crate) use recv_request_body;
40
41macro_rules! send_response_body {
42    (normal, $writer:expr, $data:expr) => {
43        $writer.send_body_normal::<_, BUF_SIZE>(&$data).await
44    };
45    (stream, $writer:expr, $data:expr) => {
46        $writer.send_body_stream::<_, BUF_SIZE>($data).await
47    };
48}
49pub(crate) use send_response_body;
50
51macro_rules! generate_server_handlers {
52    ($($endpoint_id:tt: $endpoint_name:ident($req_kind:tt: $req_type:ty) -> $res_kind:tt: $res_type:ty;)*) => {
53        use core::fmt::Display;
54
55        use $crate::macros::server::*;
56        use $crate::server::*;
57        use $crate::transport::*;
58        use $crate::transport::error::*;
59        use $crate::transport::read::ReadTransportExt as _;
60        use $crate::transport::write::WriteTransportExt as _;
61
62        use futures::Stream;
63        use futures::stream::Empty;
64
65        #[allow(async_fn_in_trait)]
66        pub trait ServerHandlers<RE: Display, WE: Display> {
67            type Error: Display + Default;
68            $(
69                gen_ep_sig!($endpoint_name, $req_kind: $req_type, $res_kind: $res_type);
70            )*
71        }
72
73        #[forbid(unreachable_patterns)]
74        impl<
75                RT: ReadTransport,
76                WT: WriteTransport,
77                H: ServerHandlers<RT::Error, WT::Error>,
78            > Server<RT, WT, H>
79        {
80            pub(crate) async fn handle<const BUF_SIZE: usize>(&mut self, header: RequestHeader) -> Result<(), TransportError<RT::Error, WT::Error>> {
81                match header.endpoint_id {
82                    $(
83                        $endpoint_id => {
84                            let req = recv_request_body!($req_kind, self.reader);
85
86                            let Ok(res) = self.handlers.$endpoint_name(req).await else {
87                                return Ok(());
88                            };
89
90                            self.writer.send_response_header(ResponseHeader {
91                                request_id: header.request_id,
92                                status: 0,
93                            }).await?;
94
95                            send_response_body!($res_kind, self.writer, res)?;
96                        }
97                    )*
98                    _ => {
99                        // send_error_response::<_, BUF_SIZE>(&mut self.writer, header.request_id, "Invalid enpoint").await?;
100                    }
101                }
102
103                Ok(())
104            }
105        }
106    };
107}
108pub(crate) use generate_server_handlers;