use crate::client::RevolutXClient;
use crate::error::Result;
use crate::model::market_data::Trade;
use crate::model::trades::Fill;
use crate::model::{Page, RawPage};
use crate::transport::{RequestSpec, encode_component};
#[derive(Debug, Clone, Default)]
pub struct TradesQuery {
pub start_date: Option<i64>,
pub end_date: Option<i64>,
pub cursor: Option<String>,
pub limit: Option<u32>,
}
impl TradesQuery {
pub(crate) fn to_query(&self) -> Vec<(String, String)> {
let mut query = Vec::new();
if let Some(start) = self.start_date {
query.push(("start_date".into(), start.to_string()));
}
if let Some(end) = self.end_date {
query.push(("end_date".into(), end.to_string()));
}
if let Some(cursor) = &self.cursor {
query.push(("cursor".into(), cursor.clone()));
}
if let Some(limit) = self.limit {
query.push(("limit".into(), limit.to_string()));
}
query
}
}
pub struct TradesApi<'a> {
client: &'a RevolutXClient,
}
impl<'a> TradesApi<'a> {
pub(crate) const fn new(client: &'a RevolutXClient) -> Self {
Self { client }
}
pub async fn all(&self, symbol: &str, query: &TradesQuery) -> Result<Page<Trade>> {
let path = format!("/trades/all/{}", encode_component(symbol));
let raw: RawPage<Trade> = self
.client
.send_json(RequestSpec::get(path).with_query(query.to_query()))
.await?;
Ok(raw.into())
}
pub async fn private(&self, symbol: &str, query: &TradesQuery) -> Result<Page<Fill>> {
let path = format!("/trades/private/{}", encode_component(symbol));
let raw: RawPage<Fill> = self
.client
.send_json(RequestSpec::get(path).with_query(query.to_query()))
.await?;
Ok(raw.into())
}
}