1
1
use crate :: core:: types:: { Quantity , SettlementAccount } ;
2
- use futures:: {
3
- future:: { err, Either } ,
4
- Future ,
5
- } ;
2
+ use futures:: TryFutureExt ;
6
3
use interledger_service:: Account ;
7
4
use log:: { debug, error, trace} ;
8
- use reqwest:: r#async :: Client ;
5
+ use reqwest:: Client ;
9
6
use serde_json:: json;
10
7
use uuid:: Uuid ;
11
8
@@ -21,11 +18,11 @@ impl SettlementClient {
21
18
}
22
19
}
23
20
24
- pub fn send_settlement < A : SettlementAccount + Account > (
21
+ pub async fn send_settlement < A : SettlementAccount + Account > (
25
22
& self ,
26
23
account : A ,
27
24
amount : u64 ,
28
- ) -> impl Future < Item = ( ) , Error = ( ) > {
25
+ ) -> Result < ( ) , ( ) > {
29
26
if let Some ( settlement_engine) = account. settlement_engine_details ( ) {
30
27
let mut settlement_engine_url = settlement_engine. url ;
31
28
settlement_engine_url
@@ -40,23 +37,37 @@ impl SettlementClient {
40
37
) ;
41
38
let settlement_engine_url_clone = settlement_engine_url. clone ( ) ;
42
39
let idempotency_uuid = Uuid :: new_v4 ( ) . to_hyphenated ( ) . to_string ( ) ;
43
- return Either :: A ( self . http_client . post ( settlement_engine_url. as_ref ( ) )
40
+ let response = self
41
+ . http_client
42
+ . post ( settlement_engine_url. as_ref ( ) )
44
43
. header ( "Idempotency-Key" , idempotency_uuid)
45
44
. json ( & json ! ( Quantity :: new( amount, account. asset_scale( ) ) ) )
46
45
. send ( )
47
- . map_err ( move |err| error ! ( "Error sending settlement command to settlement engine {}: {:?}" , settlement_engine_url, err) )
48
- . and_then ( move |response| {
49
- if response. status ( ) . is_success ( ) {
50
- trace ! ( "Sent settlement of {} to settlement engine: {}" , amount, settlement_engine_url_clone) ;
51
- Ok ( ( ) )
52
- } else {
53
- error ! ( "Error sending settlement. Settlement engine responded with HTTP code: {}" , response. status( ) ) ;
54
- Err ( ( ) )
55
- }
56
- } ) ) ;
46
+ . map_err ( move |err| {
47
+ error ! (
48
+ "Error sending settlement command to settlement engine {}: {:?}" ,
49
+ settlement_engine_url, err
50
+ )
51
+ } )
52
+ . await ?;
53
+
54
+ if response. status ( ) . is_success ( ) {
55
+ trace ! (
56
+ "Sent settlement of {} to settlement engine: {}" ,
57
+ amount,
58
+ settlement_engine_url_clone
59
+ ) ;
60
+ return Ok ( ( ) ) ;
61
+ } else {
62
+ error ! (
63
+ "Error sending settlement. Settlement engine responded with HTTP code: {}" ,
64
+ response. status( )
65
+ ) ;
66
+ return Err ( ( ) ) ;
67
+ }
57
68
}
58
69
error ! ( "Cannot send settlement for account {} because it does not have the settlement_engine_url and scale configured" , account. id( ) ) ;
59
- Either :: B ( err ( ( ) ) )
70
+ Err ( ( ) )
60
71
}
61
72
}
62
73
@@ -70,37 +81,37 @@ impl Default for SettlementClient {
70
81
mod tests {
71
82
use super :: * ;
72
83
use crate :: api:: fixtures:: TEST_ACCOUNT_0 ;
73
- use crate :: api:: test_helpers:: { block_on , mock_settlement} ;
84
+ use crate :: api:: test_helpers:: mock_settlement;
74
85
use mockito:: Matcher ;
75
86
76
- #[ test]
77
- fn settlement_ok ( ) {
87
+ #[ tokio :: test]
88
+ async fn settlement_ok ( ) {
78
89
let m = mock_settlement ( 200 )
79
90
. match_header ( "Idempotency-Key" , Matcher :: Any )
80
91
. create ( ) ;
81
92
let client = SettlementClient :: new ( ) ;
82
93
83
- let ret = block_on ( client. send_settlement ( TEST_ACCOUNT_0 . clone ( ) , 100 ) ) ;
94
+ let ret = client. send_settlement ( TEST_ACCOUNT_0 . clone ( ) , 100 ) . await ;
84
95
85
96
m. assert ( ) ;
86
97
assert ! ( ret. is_ok( ) ) ;
87
98
}
88
99
89
- #[ test]
90
- fn engine_rejects ( ) {
100
+ #[ tokio :: test]
101
+ async fn engine_rejects ( ) {
91
102
let m = mock_settlement ( 500 )
92
103
. match_header ( "Idempotency-Key" , Matcher :: Any )
93
104
. create ( ) ;
94
105
let client = SettlementClient :: new ( ) ;
95
106
96
- let ret = block_on ( client. send_settlement ( TEST_ACCOUNT_0 . clone ( ) , 100 ) ) ;
107
+ let ret = client. send_settlement ( TEST_ACCOUNT_0 . clone ( ) , 100 ) . await ;
97
108
98
109
m. assert ( ) ;
99
110
assert ! ( ret. is_err( ) ) ;
100
111
}
101
112
102
- #[ test]
103
- fn account_does_not_have_settlement_engine ( ) {
113
+ #[ tokio :: test]
114
+ async fn account_does_not_have_settlement_engine ( ) {
104
115
let m = mock_settlement ( 200 )
105
116
. expect ( 0 )
106
117
. match_header ( "Idempotency-Key" , Matcher :: Any )
@@ -109,7 +120,7 @@ mod tests {
109
120
110
121
let mut acc = TEST_ACCOUNT_0 . clone ( ) ;
111
122
acc. no_details = true ; // Hide the settlement engine data from the account
112
- let ret = block_on ( client. send_settlement ( acc, 100 ) ) ;
123
+ let ret = client. send_settlement ( acc, 100 ) . await ;
113
124
114
125
m. assert ( ) ;
115
126
assert ! ( ret. is_err( ) ) ;
0 commit comments