Skip to main content

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