jsonrpc_client_core/
response.rs1use jsonrpc_core::types::{Id, Output, Version};
10use serde;
11use serde_json;
12use {ErrorKind, Result, ResultExt};
13
14pub fn parse<R>(response_raw: &[u8], expected_id: &Id) -> Result<R>
17where
18 R: serde::de::DeserializeOwned,
19{
20 let response: Output = serde_json::from_slice(response_raw)
21 .chain_err(|| ErrorKind::ResponseError("Not valid json"))?;
22 ensure!(
23 response.version() == Some(Version::V2),
24 ErrorKind::ResponseError("Not JSON-RPC 2.0 compatible")
25 );
26 ensure!(
27 response.id() == expected_id,
28 ErrorKind::ResponseError("Response id not equal to request id")
29 );
30 match response {
31 Output::Success(success) => {
32 trace!("Received json result: {}", success.result);
33 serde_json::from_value(success.result)
34 .chain_err(|| ErrorKind::ResponseError("Not valid for target type"))
35 }
36 Output::Failure(failure) => bail!(ErrorKind::JsonRpcError(failure.error)),
37 }
38}