rpc-api 0.1.0

A typed rpc library to be used by wasm and other targets
Documentation
use std::fmt::Debug;

use async_trait::async_trait;
use serde::de::DeserializeOwned;
use serde::Serialize;

use crate::rpc;
use crate::rpc::{conversions, get_handler_key, ReqResBound};
use crate::rpc::handlers::{Payload, Request};

pub struct Proxy {
    transport: Box<dyn Transport>,
}


#[async_trait(?Send)]
pub trait Transport {
    async fn send(&self, payload: &str) -> String;
}

impl Proxy {
    pub fn new(transport: impl Transport + 'static) -> Proxy {
        Proxy {
            transport: Box::new(transport)
        }
    }
    pub async fn send<Req: ReqResBound, Res: ReqResBound>(&self, req: &Req) -> Result<Res, String>
        where Req: Request<Res>,
    {
        let req_payload = self.request_to_payload(req);
        let res_payload = self.transport.send(&req_payload).await;
        let res = conversions::rpc_res_from_str(&res_payload);
        res
    }

    fn request_to_payload<Req: ReqResBound>(&self, req: &Req) -> String {
        let handler_key = get_handler_key::<Req>();
        let req_json = conversions::rpc_req_to_str(req);
        let payload = Payload { handler_key: handler_key.as_str(), json: req_json.as_str() };
        let req_payload = payload.to_string();
        req_payload
    }
}