MINI-RPC is a stateless, light-weight remote procedure call (RPC) protocol. Inspired by the JSON-RPC 2.0 Specification, this implementation written in Rust selected its essential parts in order to keep as minimal as possible the communication between processes.
Syntax:
--> data sent to Server
<-- data sent to Client
--> {"id":1,"method":"sum","params":[1,2,3]}
<-- {"id":1,"result":6}
use minirpc::*;
use serde_json::*;
// --> Request.
let input = r#"{"id":1,"method":"sum","params":[1,2,3]}"#;
let expected = Request::Single(RequestPayload::Call(Call {
id: Id::Number(1),
method: Method::String("sum".to_owned()),
params: Params::Array(vec![Value::from(1), Value::from(2), Value::from(3)]),
}));
let result: Request = serde_json::from_str(input).unwrap();
assert_eq!(result, expected);
// <-- Response.
let input = r#"{"id":1,"result":6}"#;
let expected = Response::Single(ResponsePayload::Success(Success {
id: Id::Number(1),
result: Value::Bool(true),
}));
let result: Response = serde_json::from_str(input).unwrap();
assert_eq!(result, expected);
--> [{"method":"log","params":{"level":"info"}},{"method":"log","params":{"level":"warn"}}]
// --> Batch Request.
let input = r#"[{"method":"log","params":{"level":"info"}},{"method":"log","params":{"level":"warn"}}]"#;
let mut params_1 = Map::new();
params_1.insert("level".to_string(), "info".into());
let mut params_2 = Map::new();
params_2.insert("level".to_string(), "warn".into());
let expected = Request::Batch(vec![
RequestPayload::Notification(Notification {
method: Method::String("log".to_owned()),
params: Params::Object(params_1),
}),
RequestPayload::Notification(Notification {
method: Method::String("log".to_owned()),
params: Params::Object(params_2),
}),
]);
let result: Request = serde_json::from_str(input).unwrap();
assert_eq!(result, expected);