rpc_api/rpc/
proxy.rs

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}