44 lines
1.2 KiB
Rust
44 lines
1.2 KiB
Rust
use super::error_to_backoff;
|
|
use crate::types::alpaca::{api::outgoing, shared::order};
|
|
use backoff::{future::retry_notify, ExponentialBackoff};
|
|
use governor::DefaultDirectRateLimiter;
|
|
use log::warn;
|
|
use reqwest::{Client, Error};
|
|
use std::time::Duration;
|
|
|
|
pub use order::Order;
|
|
|
|
pub async fn get(
|
|
client: &Client,
|
|
rate_limiter: &DefaultDirectRateLimiter,
|
|
query: &outgoing::order::Order,
|
|
backoff: Option<ExponentialBackoff>,
|
|
api_base: &str,
|
|
) -> Result<Vec<Order>, Error> {
|
|
retry_notify(
|
|
backoff.unwrap_or_default(),
|
|
|| async {
|
|
rate_limiter.until_ready().await;
|
|
client
|
|
.get(&format!("https://{}.alpaca.markets/v2/orders", api_base))
|
|
.query(query)
|
|
.send()
|
|
.await
|
|
.map_err(error_to_backoff)?
|
|
.error_for_status()
|
|
.map_err(error_to_backoff)?
|
|
.json::<Vec<Order>>()
|
|
.await
|
|
.map_err(error_to_backoff)
|
|
},
|
|
|e, duration: Duration| {
|
|
warn!(
|
|
"Failed to get orders, will retry in {} seconds: {}.",
|
|
duration.as_secs(),
|
|
e
|
|
);
|
|
},
|
|
)
|
|
.await
|
|
}
|