anvil_rpc/
response.rs
1use crate::{
2 error::RpcError,
3 request::{Id, Version},
4};
5use serde::{Deserialize, Serialize};
6
7#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(deny_unknown_fields)]
10pub struct RpcResponse {
11 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#[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#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
65#[serde(deny_unknown_fields)]
66#[serde(untagged)]
67pub enum Response {
68 Single(RpcResponse),
70 Batch(Vec<RpcResponse>),
72}
73
74impl Response {
75 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}