@@ -2,57 +2,30 @@ use crate::v2::params::{Id, TwoPointZero};
22use serde:: de:: Deserializer ;
33use serde:: ser:: Serializer ;
44use serde:: { Deserialize , Serialize } ;
5- use serde_json:: value:: { RawValue , Value as JsonValue } ;
5+ use serde_json:: value:: RawValue ;
66use std:: fmt;
77use thiserror:: Error ;
88
99/// [Failed JSON-RPC response object](https://www.jsonrpc.org/specification#response_object).
10- #[ derive( Serialize , Debug ) ]
10+ #[ derive( Serialize , Deserialize , Debug , PartialEq ) ]
1111pub struct JsonRpcError < ' a > {
1212 /// JSON-RPC version.
1313 pub jsonrpc : TwoPointZero ,
1414 /// Error.
15+ #[ serde( borrow) ]
1516 pub error : JsonRpcErrorObject < ' a > ,
1617 /// Request ID
17- pub id : Option < & ' a RawValue > ,
18- }
19- /// [Failed JSON-RPC response object with allocations](https://www.jsonrpc.org/specification#response_object).
20- #[ derive( Error , Debug , Deserialize , PartialEq ) ]
21- pub struct JsonRpcErrorAlloc {
22- /// JSON-RPC version.
23- pub jsonrpc : TwoPointZero ,
24- /// JSON-RPC error object.
25- pub error : JsonRpcErrorObjectAlloc ,
26- /// Request ID.
27- pub id : Id ,
18+ pub id : Id < ' a > ,
2819}
2920
30- impl fmt:: Display for JsonRpcErrorAlloc {
31- fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
32- write ! ( f, "{:?}: {:?}: {:?} " , self . jsonrpc , self . error , self . id )
21+ impl < ' a > fmt:: Display for JsonRpcError < ' a > {
22+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
23+ write ! ( f, "{} " , serde_json :: to_string ( & self ) . expect ( "infallible; qed" ) )
3324 }
3425}
3526
3627/// JSON-RPC error object.
37- #[ derive( Debug , PartialEq , Clone , Deserialize ) ]
38- #[ serde( deny_unknown_fields) ]
39- pub struct JsonRpcErrorObjectAlloc {
40- /// Code
41- pub code : JsonRpcErrorCode ,
42- /// Message
43- pub message : String ,
44- /// Optional data
45- pub data : Option < JsonValue > ,
46- }
47-
48- impl From < JsonRpcErrorCode > for JsonRpcErrorObjectAlloc {
49- fn from ( code : JsonRpcErrorCode ) -> Self {
50- Self { code, message : code. message ( ) . to_owned ( ) , data : None }
51- }
52- }
53-
54- /// JSON-RPC error object with no extra allocations.
55- #[ derive( Debug , Serialize ) ]
28+ #[ derive( Debug , Deserialize , Serialize , Clone ) ]
5629#[ serde( deny_unknown_fields) ]
5730pub struct JsonRpcErrorObject < ' a > {
5831 /// Code
@@ -61,6 +34,7 @@ pub struct JsonRpcErrorObject<'a> {
6134 pub message : & ' a str ,
6235 /// Optional data
6336 #[ serde( skip_serializing_if = "Option::is_none" ) ]
37+ #[ serde( borrow) ]
6438 pub data : Option < & ' a RawValue > ,
6539}
6640
@@ -70,6 +44,14 @@ impl<'a> From<JsonRpcErrorCode> for JsonRpcErrorObject<'a> {
7044 }
7145}
7246
47+ impl < ' a > PartialEq for JsonRpcErrorObject < ' a > {
48+ fn eq ( & self , other : & Self ) -> bool {
49+ let this_raw = self . data . map ( |r| r. get ( ) ) ;
50+ let other_raw = self . data . map ( |r| r. get ( ) ) ;
51+ self . code == other. code && self . message == other. message && this_raw == other_raw
52+ }
53+ }
54+
7355/// Parse error code.
7456pub const PARSE_ERROR_CODE : i32 = -32700 ;
7557/// Internal error code.
@@ -180,47 +162,44 @@ impl serde::Serialize for JsonRpcErrorCode {
180162
181163#[ cfg( test) ]
182164mod tests {
183- use super :: {
184- Id , JsonRpcError , JsonRpcErrorAlloc , JsonRpcErrorCode , JsonRpcErrorObject , JsonRpcErrorObjectAlloc ,
185- TwoPointZero ,
186- } ;
165+ use super :: { Id , JsonRpcError , JsonRpcErrorCode , JsonRpcErrorObject , TwoPointZero } ;
187166
188167 #[ test]
189168 fn deserialize_works ( ) {
190169 let ser = r#"{"jsonrpc":"2.0","error":{"code":-32700,"message":"Parse error"},"id":null}"# ;
191- let err : JsonRpcErrorAlloc = serde_json :: from_str ( ser ) . unwrap ( ) ;
192- assert_eq ! ( err . jsonrpc, TwoPointZero ) ;
193- assert_eq ! (
194- err . error ,
195- JsonRpcErrorObjectAlloc { code : JsonRpcErrorCode :: ParseError , message : "Parse error" . into ( ) , data : None }
196- ) ;
197- assert_eq ! ( err . id , Id :: Null ) ;
170+ let exp = JsonRpcError {
171+ jsonrpc : TwoPointZero ,
172+ error : JsonRpcErrorObject { code : JsonRpcErrorCode :: ParseError , message : "Parse error" . into ( ) , data : None } ,
173+ id : Id :: Null ,
174+ } ;
175+ let err : JsonRpcError = serde_json :: from_str ( ser ) . unwrap ( ) ;
176+ assert_eq ! ( exp , err ) ;
198177 }
199178
200179 #[ test]
201180 fn deserialize_with_optional_data ( ) {
202181 let ser = r#"{"jsonrpc":"2.0","error":{"code":-32700,"message":"Parse error", "data":"vegan"},"id":null}"# ;
203- let err: JsonRpcErrorAlloc = serde_json:: from_str ( ser) . unwrap ( ) ;
204- assert_eq ! ( err. jsonrpc, TwoPointZero ) ;
205- assert_eq ! (
206- err. error,
207- JsonRpcErrorObjectAlloc {
182+ let data = serde_json:: value:: to_raw_value ( & "vegan" ) . unwrap ( ) ;
183+ let exp = JsonRpcError {
184+ jsonrpc : TwoPointZero ,
185+ error : JsonRpcErrorObject {
208186 code : JsonRpcErrorCode :: ParseError ,
209187 message : "Parse error" . into ( ) ,
210- data: Some ( "vegan" . into( ) )
211- }
212- ) ;
213- assert_eq ! ( err. id, Id :: Null ) ;
188+ data : Some ( & * data) ,
189+ } ,
190+ id : Id :: Null ,
191+ } ;
192+ let err: JsonRpcError = serde_json:: from_str ( ser) . unwrap ( ) ;
193+ assert_eq ! ( exp, err) ;
214194 }
215195
216196 #[ test]
217197 fn serialize_works ( ) {
218198 let exp = r#"{"jsonrpc":"2.0","error":{"code":-32603,"message":"Internal error"},"id":1337}"# ;
219- let raw_id = serde_json:: value:: to_raw_value ( & 1337 ) . unwrap ( ) ;
220199 let err = JsonRpcError {
221200 jsonrpc : TwoPointZero ,
222201 error : JsonRpcErrorObject { code : JsonRpcErrorCode :: InternalError , message : "Internal error" , data : None } ,
223- id : Some ( & * raw_id ) ,
202+ id : Id :: Number ( 1337 ) ,
224203 } ;
225204 let ser = serde_json:: to_string ( & err) . unwrap ( ) ;
226205 assert_eq ! ( exp, ser) ;
0 commit comments