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 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#[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#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
64#[serde(deny_unknown_fields)]
65#[serde(untagged)]
66pub enum Response {
67 Single(RpcResponse),
69 Batch(Vec<RpcResponse>),
71}
72
73impl Response {
74 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}