#[warn(missing_docs)]
extern crate jsonrpc_core as rpc;
extern crate serde;
extern crate serde_json;
use std::collections::HashMap;
#[derive(Default, Debug)]
pub struct Options {
pub no_print: bool,
}
#[derive(Default, Debug)]
pub struct Rpc {
pub io: rpc::IoHandler,
pub options: Options,
}
impl From<rpc::IoHandler> for Rpc {
fn from(io: rpc::IoHandler) -> Self {
Rpc { io, ..Default::default() }
}
}
impl Rpc {
pub fn new<D>(delegate: D) -> Self where
D: Into<HashMap<String, rpc::RemoteProcedure<()>>>,
{
let mut io = rpc::IoHandler::new();
io.extend_with(delegate);
io.into()
}
pub fn request<T>(&self, method: &str, params: &T) -> String where
T: serde::Serialize,
{
use self::rpc::types::response;
let request = format!(
"{{ \"jsonrpc\":\"2.0\", \"id\": 1, \"method\": \"{}\", \"params\": {} }}",
method,
serde_json::to_string_pretty(params).expect("Serialization should be infallible."),
);
let response = self.io
.handle_request_sync(&request)
.expect("We are sending a method call not notification.");
let extracted = match serde_json::from_str(&response).expect("We will always get a single output.") {
response::Output::Success(response::Success { result, .. }) => serde_json::to_string_pretty(&result),
response::Output::Failure(response::Failure { error, .. }) => serde_json::to_string_pretty(&error),
}.expect("Serialization is infallible; qed");
println!("\n{}\n --> {}\n", request, extracted);
extracted
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn should_test_simple_method() {
let rpc = {
let mut io = rpc::IoHandler::new();
io.add_method("test_method", |_| {
Ok(rpc::Value::Number(5.into()))
});
Rpc::from(io)
};
assert_eq!(
rpc.request("test_method", &[5u64]),
r#"5"#
);
}
}