rktk_rrp/macros/
server.rs1macro_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 }
101 }
102
103 Ok(())
104 }
105 }
106 };
107}
108pub(crate) use generate_server_handlers;