Skip to content

Commit 542a233

Browse files
committed
feat(settlement/api): Upgrade the settlement client
This gets consumed by the balance service
1 parent d266898 commit 542a233

File tree

1 file changed

+40
-29
lines changed
  • crates/interledger-settlement/src/api

1 file changed

+40
-29
lines changed

crates/interledger-settlement/src/api/client.rs

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
use crate::core::types::{Quantity, SettlementAccount};
2-
use futures::{
3-
future::{err, Either},
4-
Future,
5-
};
2+
use futures::TryFutureExt;
63
use interledger_service::Account;
74
use log::{debug, error, trace};
8-
use reqwest::r#async::Client;
5+
use reqwest::Client;
96
use serde_json::json;
107
use uuid::Uuid;
118

@@ -21,11 +18,11 @@ impl SettlementClient {
2118
}
2219
}
2320

24-
pub fn send_settlement<A: SettlementAccount + Account>(
21+
pub async fn send_settlement<A: SettlementAccount + Account>(
2522
&self,
2623
account: A,
2724
amount: u64,
28-
) -> impl Future<Item = (), Error = ()> {
25+
) -> Result<(), ()> {
2926
if let Some(settlement_engine) = account.settlement_engine_details() {
3027
let mut settlement_engine_url = settlement_engine.url;
3128
settlement_engine_url
@@ -40,23 +37,37 @@ impl SettlementClient {
4037
);
4138
let settlement_engine_url_clone = settlement_engine_url.clone();
4239
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())
4443
.header("Idempotency-Key", idempotency_uuid)
4544
.json(&json!(Quantity::new(amount, account.asset_scale())))
4645
.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+
}
5768
}
5869
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(())
6071
}
6172
}
6273

@@ -70,37 +81,37 @@ impl Default for SettlementClient {
7081
mod tests {
7182
use super::*;
7283
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;
7485
use mockito::Matcher;
7586

76-
#[test]
77-
fn settlement_ok() {
87+
#[tokio::test]
88+
async fn settlement_ok() {
7889
let m = mock_settlement(200)
7990
.match_header("Idempotency-Key", Matcher::Any)
8091
.create();
8192
let client = SettlementClient::new();
8293

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;
8495

8596
m.assert();
8697
assert!(ret.is_ok());
8798
}
8899

89-
#[test]
90-
fn engine_rejects() {
100+
#[tokio::test]
101+
async fn engine_rejects() {
91102
let m = mock_settlement(500)
92103
.match_header("Idempotency-Key", Matcher::Any)
93104
.create();
94105
let client = SettlementClient::new();
95106

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;
97108

98109
m.assert();
99110
assert!(ret.is_err());
100111
}
101112

102-
#[test]
103-
fn account_does_not_have_settlement_engine() {
113+
#[tokio::test]
114+
async fn account_does_not_have_settlement_engine() {
104115
let m = mock_settlement(200)
105116
.expect(0)
106117
.match_header("Idempotency-Key", Matcher::Any)
@@ -109,7 +120,7 @@ mod tests {
109120

110121
let mut acc = TEST_ACCOUNT_0.clone();
111122
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;
113124

114125
m.assert();
115126
assert!(ret.is_err());

0 commit comments

Comments
 (0)