rpc_api/rpc/
conversions.rs

1use std::fmt::Debug;
2
3use serde::de::DeserializeOwned;
4use serde::Serialize;
5use serde_json::Error;
6
7pub fn rpc_req_to_str<Req>(req: &Req) -> String
8    where Req: ?Sized + Serialize + DeserializeOwned + Debug {
9    let req_json = serde_json::to_string(req).unwrap();
10    req_json
11}
12
13pub fn rpc_req_from_str<Req>(payload: &str) -> Result<Req, String>
14    where Req: ?Sized + Serialize + DeserializeOwned + Debug {
15    let result_req = serde_json::from_str(payload);
16    match result_req {
17        Ok(req) => { Ok(req) }
18        Err(err) => { Err(rpc_error("serde from_str failed")) }
19    }
20}
21
22pub fn rpc_error(msg: &str) -> String {
23    return format!("success=0\n{}", msg);
24}
25
26pub fn rpc_success(msg: &str) -> String {
27    return format!("success=1\n{}", msg);
28}
29
30pub fn rpc_res_to_str<Res>(res: &Res) -> String
31    where Res: ?Sized + Serialize + DeserializeOwned + Debug {
32    let res_json = serde_json::to_string(&res).unwrap();
33    rpc_success(&res_json)
34}
35
36pub fn rpc_res_from_str<Res>(res_payload: &String) -> Result<Res, String>
37    where Res: ?Sized + Serialize + DeserializeOwned + Debug {
38    let mut s = res_payload.splitn(2, "\n");
39    let header = s.next().ok_or("Payload split 1")?;
40    let body = s.next().ok_or("Payload split 2")?;
41    match header {
42        "success=0" => { Err(body.to_string()) }
43        "success=1" => {
44            let res: Res = serde_json::from_str(&body).unwrap();
45            Ok(res)
46        }
47        _ => { Err("unrecognized payload".to_string()) }
48    }
49}