use crate::error::Result;
use crate::http::HttpClient;
use crate::types::{CursorResponse, Liquidation, LiquidationVolume, Timestamp};
#[derive(Debug)]
pub struct LiquidationHistoryParams {
pub start: Timestamp,
pub end: Timestamp,
pub cursor: Option<String>,
pub limit: Option<i64>,
}
#[derive(Debug)]
pub struct LiquidationsByUserParams {
pub start: Timestamp,
pub end: Timestamp,
pub coin: Option<String>,
pub cursor: Option<String>,
pub limit: Option<i64>,
}
#[derive(Debug)]
pub struct LiquidationVolumeParams {
pub start: Timestamp,
pub end: Timestamp,
pub interval: Option<String>,
pub cursor: Option<String>,
pub limit: Option<i64>,
}
#[derive(Debug, Clone)]
pub struct LiquidationsResource {
http: HttpClient,
prefix: String,
}
impl LiquidationsResource {
pub(crate) fn new(http: HttpClient, prefix: &str) -> Self {
Self {
http,
prefix: prefix.to_string(),
}
}
pub async fn history(
&self,
symbol: &str,
params: LiquidationHistoryParams,
) -> Result<CursorResponse<Vec<Liquidation>>> {
let mut qp = vec![
("start", params.start.to_millis().to_string()),
("end", params.end.to_millis().to_string()),
];
if let Some(c) = ¶ms.cursor {
qp.push(("cursor", c.clone()));
}
if let Some(l) = params.limit {
qp.push(("limit", l.to_string()));
}
let (data, next_cursor) = self
.http
.get_with_cursor(&format!("{}/liquidations/{}", self.prefix, symbol), &qp)
.await?;
Ok(CursorResponse { data, next_cursor })
}
pub async fn by_user(
&self,
user_address: &str,
params: LiquidationsByUserParams,
) -> Result<CursorResponse<Vec<Liquidation>>> {
let mut qp = vec![
("start", params.start.to_millis().to_string()),
("end", params.end.to_millis().to_string()),
];
if let Some(c) = ¶ms.coin {
qp.push(("coin", c.clone()));
}
if let Some(c) = ¶ms.cursor {
qp.push(("cursor", c.clone()));
}
if let Some(l) = params.limit {
qp.push(("limit", l.to_string()));
}
let (data, next_cursor) = self
.http
.get_with_cursor(
&format!("{}/liquidations/{}", self.prefix, user_address),
&qp,
)
.await?;
Ok(CursorResponse { data, next_cursor })
}
pub async fn volume(
&self,
symbol: &str,
params: LiquidationVolumeParams,
) -> Result<CursorResponse<Vec<LiquidationVolume>>> {
let mut qp = vec![
("start", params.start.to_millis().to_string()),
("end", params.end.to_millis().to_string()),
];
if let Some(i) = ¶ms.interval {
qp.push(("interval", i.clone()));
}
if let Some(c) = ¶ms.cursor {
qp.push(("cursor", c.clone()));
}
if let Some(l) = params.limit {
qp.push(("limit", l.to_string()));
}
let (data, next_cursor) = self
.http
.get_with_cursor(
&format!("{}/liquidations/{}/volume", self.prefix, symbol),
&qp,
)
.await?;
Ok(CursorResponse { data, next_cursor })
}
}