rpc_api/rpc/
conversions.rs1use 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}