11use {
22 crate :: {
3- error:: { BoxError , Error } ,
3+ error:: { BoxError , ClientError , Error } ,
44 ConnectionOptions ,
55 MessageIdGenerator ,
66 } ,
99 auth:: ed25519_dalek:: SigningKey ,
1010 domain:: { DecodedClientId , SubscriptionId , Topic } ,
1111 jwt:: { self , JwtError , VerifyableClaims } ,
12- rpc:: { self , Receipt , RequestPayload } ,
12+ rpc:: { self , Receipt , ServiceRequest } ,
1313 } ,
1414 std:: { sync:: Arc , time:: Duration } ,
1515 url:: Url ,
1616} ;
1717
1818pub type TransportError = reqwest:: Error ;
19- pub type Response < T > = Result < <T as RequestPayload >:: Response , Error > ;
20- pub type EmptyResponse = Result < ( ) , Error > ;
19+ pub type Response < T > = Result < <T as ServiceRequest >:: Response , Error < < T as ServiceRequest > :: Error > > ;
20+ pub type EmptyResponse < T > = Result < ( ) , Error < < T as ServiceRequest > :: Error > > ;
2121
2222#[ derive( Debug , thiserror:: Error ) ]
2323pub enum RequestParamsError {
@@ -41,9 +41,6 @@ pub enum HttpClientError {
4141
4242 #[ error( "JWT error: {0}" ) ]
4343 Jwt ( #[ from] JwtError ) ,
44-
45- #[ error( "RPC error: code={} message={}" , . 0 . code, . 0 . message) ]
46- RpcError ( rpc:: ErrorData ) ,
4744}
4845
4946#[ derive( Debug , Clone ) ]
@@ -82,7 +79,7 @@ pub struct Client {
8279}
8380
8481impl Client {
85- pub fn new ( opts : & ConnectionOptions ) -> Result < Self , Error > {
82+ pub fn new ( opts : & ConnectionOptions ) -> Result < Self , ClientError > {
8683 let mut headers = HeaderMap :: new ( ) ;
8784 opts. update_request_headers ( & mut headers) ?;
8885
@@ -111,11 +108,14 @@ impl Client {
111108 tag : u32 ,
112109 ttl : Duration ,
113110 prompt : bool ,
114- ) -> EmptyResponse {
111+ ) -> EmptyResponse < rpc :: Publish > {
115112 let ttl_secs = ttl
116113 . as_secs ( )
117114 . try_into ( )
118- . map_err ( |_| HttpClientError :: InvalidRequest ( RequestParamsError :: InvalidTtl . into ( ) ) ) ?;
115+ . map_err ( |_| {
116+ HttpClientError :: InvalidRequest ( RequestParamsError :: InvalidTtl . into ( ) ) . into ( )
117+ } )
118+ . map_err ( Error :: Client ) ?;
119119
120120 self . request ( rpc:: Publish {
121121 topic,
@@ -175,7 +175,8 @@ impl Client {
175175 . ttl
176176 . as_secs ( )
177177 . try_into ( )
178- . map_err ( |err| HttpClientError :: InvalidRequest ( Box :: new ( err) ) ) ?;
178+ . map_err ( |err| HttpClientError :: InvalidRequest ( Box :: new ( err) ) . into ( ) )
179+ . map_err ( Error :: Client ) ?;
179180 let exp = iat + ttl_sec;
180181
181182 let claims = rpc:: WatchRegisterClaims {
@@ -194,7 +195,11 @@ impl Client {
194195 } ;
195196
196197 let payload = rpc:: WatchRegister {
197- register_auth : claims. encode ( keypair) . map_err ( HttpClientError :: Jwt ) ?,
198+ register_auth : claims
199+ . encode ( keypair)
200+ . map_err ( HttpClientError :: Jwt )
201+ . map_err ( ClientError :: from)
202+ . map_err ( Error :: Client ) ?,
198203 } ;
199204
200205 self . request ( payload) . await
@@ -230,7 +235,11 @@ impl Client {
230235 } ;
231236
232237 let payload = rpc:: WatchUnregister {
233- unregister_auth : claims. encode ( keypair) . map_err ( HttpClientError :: Jwt ) ?,
238+ unregister_auth : claims
239+ . encode ( keypair)
240+ . map_err ( HttpClientError :: Jwt )
241+ . map_err ( ClientError :: from)
242+ . map_err ( Error :: Client ) ?,
234243 } ;
235244
236245 self . request ( payload) . await
@@ -299,45 +308,50 @@ impl Client {
299308
300309 pub ( crate ) async fn request < T > ( & self , payload : T ) -> Response < T >
301310 where
302- T : RequestPayload ,
311+ T : ServiceRequest ,
303312 {
304313 let payload = rpc:: Payload :: Request ( rpc:: Request {
305314 id : self . id_generator . next ( ) ,
306315 jsonrpc : rpc:: JSON_RPC_VERSION . clone ( ) ,
307316 params : payload. into_params ( ) ,
308317 } ) ;
309318
310- let result = self
311- . client
312- . post ( self . url . clone ( ) )
313- . json ( & payload)
314- . send ( )
315- . await
316- . map_err ( HttpClientError :: Transport ) ?;
319+ let response = async {
320+ let result = self
321+ . client
322+ . post ( self . url . clone ( ) )
323+ . json ( & payload)
324+ . send ( )
325+ . await
326+ . map_err ( HttpClientError :: Transport ) ?;
317327
318- let status = result. status ( ) ;
328+ let status = result. status ( ) ;
319329
320- if !status. is_success ( ) {
321- let body = result. text ( ) . await ;
322- return Err ( HttpClientError :: InvalidHttpCode ( status, body) . into ( ) ) ;
323- }
330+ if !status. is_success ( ) {
331+ let body = result. text ( ) . await ;
332+ return Err ( HttpClientError :: InvalidHttpCode ( status, body) ) ;
333+ }
324334
325- let response = result
326- . json :: < rpc:: Payload > ( )
327- . await
328- . map_err ( |_| HttpClientError :: InvalidResponse ) ?;
335+ result
336+ . json :: < rpc:: Payload > ( )
337+ . await
338+ . map_err ( |_| HttpClientError :: InvalidResponse )
339+ }
340+ . await
341+ . map_err ( ClientError :: from)
342+ . map_err ( Error :: Client ) ?;
329343
330344 match response {
331345 rpc:: Payload :: Response ( rpc:: Response :: Success ( response) ) => {
332346 serde_json:: from_value ( response. result )
333- . map_err ( |_| HttpClientError :: InvalidResponse . into ( ) )
347+ . map_err ( |_| Error :: Client ( HttpClientError :: InvalidResponse . into ( ) ) )
334348 }
335349
336350 rpc:: Payload :: Response ( rpc:: Response :: Error ( response) ) => {
337- Err ( HttpClientError :: RpcError ( response. error ) . into ( ) )
351+ Err ( ClientError :: from ( response. error ) . into ( ) )
338352 }
339353
340- _ => Err ( HttpClientError :: InvalidResponse . into ( ) ) ,
354+ _ => Err ( Error :: Client ( HttpClientError :: InvalidResponse . into ( ) ) ) ,
341355 }
342356 }
343357}
0 commit comments