anvil_rpc/
response.rs

1use crate::{
2    error::RpcError,
3    request::{Id, Version},
4};
5use serde::{Deserialize, Serialize};
6
7/// Response of a _single_ rpc call
8#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(deny_unknown_fields)]
10pub struct RpcResponse {
11    // JSON RPC version
12    jsonrpc: Version,
13    #[serde(skip_serializing_if = "Option::is_none")]
14    id: Option<Id>,
15    #[serde(flatten)]
16    result: ResponseResult,
17}
18
19impl From<RpcError> for RpcResponse {
20    fn from(e: RpcError) -> Self {
21        Self { jsonrpc: Version::V2, id: None, result: ResponseResult::Error(e) }
22    }
23}
24
25impl RpcResponse {
26    pub fn new(id: Id, content: impl Into<ResponseResult>) -> Self {
27        Self { jsonrpc: Version::V2, id: Some(id), result: content.into() }
28    }
29
30    pub fn invalid_request(id: Id) -> Self {
31        Self::new(id, RpcError::invalid_request())
32    }
33}
34
35/// Represents the result of a call either success or error
36#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
37#[serde(deny_unknown_fields)]
38pub enum ResponseResult {
39    #[serde(rename = "result")]
40    Success(serde_json::Value),
41    #[serde(rename = "error")]
42    Error(RpcError),
43}
44
45impl ResponseResult {
46    pub fn success<S>(content: S) -> Self
47    where
48        S: Serialize + 'static,
49    {
50        Self::Success(serde_json::to_value(&content).unwrap())
51    }
52
53    pub fn error(error: RpcError) -> Self {
54        Self::Error(error)
55    }
56}
57
58impl From<RpcError> for ResponseResult {
59    fn from(err: RpcError) -> Self {
60        Self::error(err)
61    }
62}
63/// Synchronous response
64#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
65#[serde(deny_unknown_fields)]
66#[serde(untagged)]
67pub enum Response {
68    /// single json rpc response
69    Single(RpcResponse),
70    /// batch of several responses
71    Batch(Vec<RpcResponse>),
72}
73
74impl Response {
75    /// Creates new [`Response`] with the given [`RpcError`].
76    pub fn error(error: RpcError) -> Self {
77        RpcResponse::new(Id::Null, ResponseResult::Error(error)).into()
78    }
79}
80
81impl From<RpcError> for Response {
82    fn from(err: RpcError) -> Self {
83        Self::error(err)
84    }
85}
86
87impl From<RpcResponse> for Response {
88    fn from(resp: RpcResponse) -> Self {
89        Self::Single(resp)
90    }
91}