1use std::fmt::Debug;
2
3use async_trait::async_trait;
4use serde::de::DeserializeOwned;
5use serde::Serialize;
6
7use crate::rpc;
8use crate::rpc::{conversions, get_handler_key, ReqResBound};
9use crate::rpc::handlers::{Payload, Request};
10
11pub struct Proxy {
12 transport: Box<dyn Transport>,
13}
14
15
16#[async_trait(?Send)]
17pub trait Transport {
18 async fn send(&self, payload: &str) -> String;
19}
20
21impl Proxy {
22 pub fn new(transport: impl Transport + 'static) -> Proxy {
23 Proxy {
24 transport: Box::new(transport)
25 }
26 }
27 pub async fn send<Req: ReqResBound, Res: ReqResBound>(&self, req: &Req) -> Result<Res, String>
28 where Req: Request<Res>,
29 {
30 let req_payload = self.request_to_payload(req);
31 let res_payload = self.transport.send(&req_payload).await;
32 let res = conversions::rpc_res_from_str(&res_payload);
33 res
34 }
35
36 fn request_to_payload<Req: ReqResBound>(&self, req: &Req) -> String {
37 let handler_key = get_handler_key::<Req>();
38 let req_json = conversions::rpc_req_to_str(req);
39 let payload = Payload { handler_key: handler_key.as_str(), json: req_json.as_str() };
40 let req_payload = payload.to_string();
41 req_payload
42 }
43}