use polyoxide_core::HttpClient;
use crate::{
error::BinanceError,
usdm::{
request::{route_builder, Routed},
types::{
AggTrade, Depth, DepthLimit, FundingRate, Interval, Kline, OpenInterest, PremiumIndex,
Symbol, Ticker24h,
},
},
weight::{Cost, Route},
};
#[derive(Debug, Clone)]
pub struct MarketApi {
pub(crate) http: HttpClient,
}
impl MarketApi {
fn request<T>(&self, route: Route) -> Routed<T> {
Routed::new(&self.http, route)
}
pub fn ticker_24h(&self, symbol: &Symbol) -> GetTicker24h {
GetTicker24h {
request: self
.request(Route::Ticker24h { all: false })
.query("symbol", symbol),
}
}
pub fn tickers_24h(&self) -> GetTickers24h {
GetTickers24h {
request: self.request(Route::Ticker24h { all: true }),
}
}
pub fn premium_index(&self, symbol: &Symbol) -> GetPremiumIndex {
GetPremiumIndex {
request: self
.request(Route::PremiumIndex { all: false })
.query("symbol", symbol),
}
}
pub fn premium_indices(&self) -> GetPremiumIndices {
GetPremiumIndices {
request: self.request(Route::PremiumIndex { all: true }),
}
}
pub fn klines(&self, symbol: &Symbol, interval: Interval) -> GetKlines {
GetKlines {
request: self
.request(Route::Klines { limit: None })
.query("symbol", symbol)
.query("interval", interval),
}
}
pub fn funding_rate(&self) -> GetFundingRate {
GetFundingRate {
request: self.request(Route::FundingRate),
}
}
pub fn open_interest(&self, symbol: &Symbol) -> GetOpenInterest {
GetOpenInterest {
request: self.request(Route::OpenInterest).query("symbol", symbol),
}
}
pub fn agg_trades(&self, symbol: &Symbol) -> GetAggTrades {
GetAggTrades {
request: self.request(Route::AggTrades).query("symbol", symbol),
}
}
pub fn depth(&self, symbol: &Symbol) -> GetDepth {
GetDepth {
request: self
.request(Route::Depth { limit: None })
.query("symbol", symbol),
}
}
}
route_builder! {
GetTicker24h => Ticker24h
}
route_builder! {
GetTickers24h => Vec<Ticker24h>
}
route_builder! {
GetPremiumIndex => PremiumIndex
}
route_builder! {
GetPremiumIndices => Vec<PremiumIndex>
}
route_builder! {
GetOpenInterest => OpenInterest
}
#[must_use = "a request does nothing until it is sent"]
pub struct GetKlines {
request: Routed<Vec<Kline>>,
}
impl GetKlines {
polyoxide_core::query_setters! {
start_time: u64 => "startTime",
end_time: u64 => "endTime",
}
pub fn limit(mut self, limit: u32) -> Self {
self.request = self
.request
.route(Route::Klines { limit: Some(limit) })
.query("limit", limit);
self
}
pub fn cost(&self) -> Cost {
self.request.cost()
}
pub async fn send(self) -> Result<Vec<Kline>, BinanceError> {
self.request.send().await
}
}
#[must_use = "a request does nothing until it is sent"]
pub struct GetFundingRate {
request: Routed<Vec<FundingRate>>,
}
impl GetFundingRate {
polyoxide_core::query_setters! {
symbol: &Symbol => "symbol",
start_time: u64 => "startTime",
end_time: u64 => "endTime",
limit: u32 => "limit",
}
pub fn cost(&self) -> Cost {
self.request.cost()
}
pub async fn send(self) -> Result<Vec<FundingRate>, BinanceError> {
self.request.send().await
}
}
#[must_use = "a request does nothing until it is sent"]
pub struct GetAggTrades {
request: Routed<Vec<AggTrade>>,
}
impl GetAggTrades {
polyoxide_core::query_setters! {
from_id: u64 => "fromId",
start_time: u64 => "startTime",
end_time: u64 => "endTime",
limit: u32 => "limit",
}
pub fn cost(&self) -> Cost {
self.request.cost()
}
pub async fn send(self) -> Result<Vec<AggTrade>, BinanceError> {
self.request.send().await
}
}
#[must_use = "a request does nothing until it is sent"]
pub struct GetDepth {
request: Routed<Depth>,
}
impl GetDepth {
pub fn limit(mut self, limit: DepthLimit) -> Self {
self.request = self
.request
.route(Route::Depth { limit: Some(limit) })
.query("limit", limit);
self
}
pub fn cost(&self) -> Cost {
self.request.cost()
}
pub async fn send(self) -> Result<Depth, BinanceError> {
self.request.send().await
}
}