@@ -63,6 +63,7 @@ extern crate serde;
63
63
extern crate serde_json;
64
64
65
65
use futures:: future:: Future ;
66
+ use jsonrpc_core:: types:: { Id , MethodCall , Params , Version } ;
66
67
use serde_json:: Value as JsonValue ;
67
68
68
69
/// Contains the main macro of this crate, `jsonrpc_client`.
@@ -146,24 +147,30 @@ pub trait Transport: Clone + Send + 'static {
146
147
/// # Not intended for direct use
147
148
/// This is being called from the client structs generated by the `jsonrpc_client` macro. This
148
149
/// function is not intended to be used directly, only the generated structs should call this.
149
- pub fn call_method < T , P , R > ( mut transport : T , method : & str , params : P ) -> RpcRequest < R >
150
+ pub fn call_method < T , P , R > ( mut transport : T , method : String , params : P ) -> RpcRequest < R >
150
151
where
151
152
T : Transport ,
152
153
P : serde:: Serialize ,
153
- for < ' de > R : serde:: Deserialize < ' de > + Send + ' static ,
154
+ R : serde:: de :: DeserializeOwned + Send + ' static ,
154
155
{
155
- let id = transport. get_next_id ( ) ;
156
- trace ! ( "Serializing call to method \" {}\" with id {}" , method, id) ;
157
- let request = serialize_request ( id, method, params) . chain_err ( || ErrorKind :: SerializeError ) ;
158
- let method_copy1 = method. to_owned ( ) ;
159
- let method_copy2 = method. to_owned ( ) ;
156
+ let raw_id = transport. get_next_id ( ) ;
157
+ let id = Id :: Num ( raw_id) ;
158
+ trace ! (
159
+ "Serializing call to method \" {}\" with id {}" ,
160
+ method,
161
+ raw_id
162
+ ) ;
163
+ let request = serialize_request ( id. clone ( ) , method. clone ( ) , params)
164
+ . chain_err ( || ErrorKind :: SerializeError ) ;
165
+ let method_copy1 = method. clone ( ) ;
166
+ let method_copy2 = method. clone ( ) ;
160
167
161
168
let future = futures:: future:: result ( request)
162
169
. and_then ( move |request_raw| {
163
170
trace ! (
164
171
"Sending call to method \" {}\" with id {} to transport" ,
165
172
method_copy1,
166
- id
173
+ raw_id
167
174
) ;
168
175
transport
169
176
. send ( request_raw)
@@ -173,7 +180,7 @@ where
173
180
trace ! (
174
181
"Deserializing response to method \" {}\" with id {}" ,
175
182
method_copy2,
176
- id
183
+ raw_id
177
184
) ;
178
185
response:: parse :: < R > ( & response_raw, id)
179
186
} ) ;
@@ -183,20 +190,26 @@ where
183
190
184
191
/// Creates a JSON-RPC 2.0 request to the given method with the given parameters.
185
192
fn serialize_request < P > (
186
- id : u64 ,
187
- method : & str ,
193
+ id : Id ,
194
+ method : String ,
188
195
params : P ,
189
196
) -> :: std:: result:: Result < Vec < u8 > , serde_json:: error:: Error >
190
197
where
191
198
P : serde:: Serialize ,
192
199
{
193
- let mut request_map = serde_json:: Map :: new ( ) ;
194
- request_map. insert ( String :: from ( "jsonrpc" ) , JsonValue :: from ( "2.0" ) ) ;
195
- request_map. insert ( String :: from ( "id" ) , JsonValue :: from ( id) ) ;
196
- request_map. insert ( String :: from ( "method" ) , JsonValue :: from ( method) ) ;
197
- request_map. insert ( String :: from ( "params" ) , serde_json:: to_value ( params) ?) ;
198
-
199
- serde_json:: to_vec ( & JsonValue :: Object ( request_map) )
200
+ let serialized_params = match serde_json:: to_value ( params) ? {
201
+ JsonValue :: Null => None ,
202
+ JsonValue :: Array ( vec) => Some ( Params :: Array ( vec) ) ,
203
+ JsonValue :: Object ( obj) => Some ( Params :: Map ( obj) ) ,
204
+ value => Some ( Params :: Array ( vec ! [ value] ) ) ,
205
+ } ;
206
+ let method_call = MethodCall {
207
+ jsonrpc : Some ( Version :: V2 ) ,
208
+ method : method. to_owned ( ) ,
209
+ params : serialized_params,
210
+ id,
211
+ } ;
212
+ serde_json:: to_vec ( & method_call)
200
213
}
201
214
202
215
0 commit comments