@@ -28,7 +28,7 @@ use serde::de;
28
28
pub use http:: Uri ;
29
29
use tokio:: sync:: RwLock ;
30
30
31
- /// HTTP client for interacting with the API.
31
+ /// Thread safe HTTP client for interacting with the API.
32
32
pub struct Client < C > {
33
33
inner : Arc < RwLock < ClientInner < C > > > ,
34
34
}
@@ -73,18 +73,22 @@ impl Client<HttpConnector> {
73
73
}
74
74
75
75
/// Returns a serialized json request as string and the request id.
76
- pub async fn raw_request ( & self , method : & str , params : & Params ) -> ( Id , String ) {
76
+ pub async fn raw_request ( & self , method : & str , params : & Params ) -> Result < ( Id , String ) > {
77
77
let id = self . next_id ( ) . await ;
78
78
let request = jsonrpc_core:: Request :: Single ( Call :: MethodCall ( MethodCall {
79
79
jsonrpc : Some ( Version :: V2 ) ,
80
80
method : method. to_owned ( ) ,
81
81
params : params. to_owned ( ) ,
82
82
id : id. clone ( ) ,
83
83
} ) ) ;
84
- (
85
- id,
86
- serde_json:: to_string ( & request) . expect ( "jsonrpc request should be serializable" ) ,
87
- )
84
+ let request = serde_json:: to_string ( & request) . map_err ( |e| {
85
+ Error :: new (
86
+ ErrorKind :: Other ,
87
+ format ! ( "jsonrpc request should be serializable: {}" , e) ,
88
+ )
89
+ } ) ?;
90
+
91
+ Ok ( ( id, request) )
88
92
}
89
93
90
94
/// Returns a recoverable signature from 32 byte SHA256 message.
@@ -98,7 +102,7 @@ impl Client<HttpConnector> {
98
102
99
103
/// Returns a PingResponse from client request.
100
104
pub async fn ping ( & self ) -> Result < PingResponse > {
101
- let ( _id, json_request) = self . raw_request ( "ping" , & Params :: None ) . await ;
105
+ let ( _id, json_request) = self . raw_request ( "ping" , & Params :: None ) . await ? ;
102
106
let resp = self . post_de :: < PingResponse > ( & json_request) . await ?;
103
107
104
108
Ok ( resp)
@@ -109,7 +113,7 @@ impl Client<HttpConnector> {
109
113
let arg_value = serde_json:: to_value ( & DecodeTxArgs { tx_data } ) ?;
110
114
let ( _id, json_request) = self
111
115
. raw_request ( "decodeTx" , & Params :: Array ( vec ! [ arg_value] ) )
112
- . await ;
116
+ . await ? ;
113
117
let resp = self . post_de :: < DecodeTxResponse > ( & json_request) . await ?;
114
118
115
119
Ok ( resp)
@@ -127,7 +131,7 @@ impl Client<HttpConnector> {
127
131
} ) ?;
128
132
let ( _id, json_request) = self
129
133
. raw_request ( "issueTx" , & Params :: Array ( vec ! [ arg_value] ) )
130
- . await ;
134
+ . await ? ;
131
135
let resp = self . post_de :: < IssueTxResponse > ( & json_request) . await ?;
132
136
133
137
Ok ( resp)
@@ -141,7 +145,7 @@ impl Client<HttpConnector> {
141
145
} ) ?;
142
146
let ( _id, json_request) = self
143
147
. raw_request ( "resolve" , & Params :: Array ( vec ! [ arg_value] ) )
144
- . await ;
148
+ . await ? ;
145
149
let resp = self . post_de :: < ResolveResponse > ( & json_request) . await ?;
146
150
147
151
Ok ( resp)
@@ -241,9 +245,9 @@ pub fn get_or_create_pk(path: &str) -> Result<key::secp256k1::private_key::Key>
241
245
#[ tokio:: test]
242
246
async fn test_raw_request ( ) {
243
247
let cli = Client :: new ( Uri :: from_static ( "http://test.url" ) ) ;
244
- let ( id, _) = cli. raw_request ( "ping" , & Params :: None ) . await ;
248
+ let ( id, _) = cli. raw_request ( "ping" , & Params :: None ) . await ? ;
245
249
assert_eq ! ( id, jsonrpc_core:: Id :: Num ( 0 ) ) ;
246
- let ( id, req) = cli. raw_request ( "ping" , & Params :: None ) . await ;
250
+ let ( id, req) = cli. raw_request ( "ping" , & Params :: None ) . await ? ;
247
251
assert_eq ! ( id, jsonrpc_core:: Id :: Num ( 1 ) ) ;
248
252
assert_eq ! (
249
253
req,
0 commit comments