use jsonrpc_core::types::{Id, Output, Version};
use serde;
use serde_json;
use {ErrorKind, Result, ResultExt};
pub fn parse<R>(response_raw: &[u8], expected_id: &Id) -> Result<R>
where
R: serde::de::DeserializeOwned,
{
let response: Output = serde_json::from_slice(response_raw)
.chain_err(|| ErrorKind::ResponseError("Not valid json"))?;
ensure!(
response.version() == Some(Version::V2),
ErrorKind::ResponseError("Not JSON-RPC 2.0 compatible")
);
ensure!(
response.id() == expected_id,
ErrorKind::ResponseError("Response id not equal to request id")
);
match response {
Output::Success(success) => {
trace!("Received json result: {}", success.result);
serde_json::from_value(success.result)
.chain_err(|| ErrorKind::ResponseError("Not valid for target type"))
}
Output::Failure(failure) => bail!(ErrorKind::JsonRpcError(failure.error)),
}
}