use crate::util::build_request;
use crate::model::{
AggTrade, AveragePrice, BookTickers, KlineSummaries, KlineSummary, OrderBook, PriceStats,
Prices, SymbolPrice, Tickers,
};
use crate::client::Client;
use crate::errors::Result; use std::collections::BTreeMap;
use serde_json::Value;
use crate::api::API;
use crate::api::Spot;
#[derive(Clone)]
pub struct Market {
pub client: Client,
pub recv_window: u64, }
impl Market {
pub async fn get_depth<S>(&self, symbol: S) -> Result<OrderBook>
where
S: Into<String>,
{
let mut parameters: BTreeMap<String, String> = BTreeMap::new();
parameters.insert("symbol".into(), symbol.into());
let request = build_request(parameters);
self.client.get(API::Spot(Spot::Depth), Some(request)).await }
pub async fn get_custom_depth<S>(&self, symbol: S, depth: u64) -> Result<OrderBook>
where
S: Into<String>,
{
let mut parameters: BTreeMap<String, String> = BTreeMap::new();
parameters.insert("symbol".into(), symbol.into());
parameters.insert("limit".into(), depth.to_string());
let request = build_request(parameters);
self.client.get(API::Spot(Spot::Depth), Some(request)).await }
pub async fn get_all_prices(&self) -> Result<Prices> {
self.client.get(API::Spot(Spot::Price), None).await }
pub async fn get_price<S>(&self, symbol: S) -> Result<SymbolPrice>
where
S: Into<String>,
{
let mut parameters: BTreeMap<String, String> = BTreeMap::new();
parameters.insert("symbol".into(), symbol.into());
let request = build_request(parameters);
self.client.get(API::Spot(Spot::Price), Some(request)).await }
pub async fn get_average_price<S>(&self, symbol: S) -> Result<AveragePrice>
where
S: Into<String>,
{
let mut parameters: BTreeMap<String, String> = BTreeMap::new();
parameters.insert("symbol".into(), symbol.into());
let request = build_request(parameters);
self.client
.get(API::Spot(Spot::AvgPrice), Some(request))
.await }
pub async fn get_all_book_tickers(&self) -> Result<BookTickers> {
self.client.get(API::Spot(Spot::BookTicker), None).await }
pub async fn get_book_ticker<S>(&self, symbol: S) -> Result<Tickers>
where
S: Into<String>,
{
let mut parameters: BTreeMap<String, String> = BTreeMap::new();
parameters.insert("symbol".into(), symbol.into());
let request = build_request(parameters);
self.client
.get(API::Spot(Spot::BookTicker), Some(request))
.await }
pub async fn get_24h_price_stats<S>(&self, symbol: S) -> Result<PriceStats>
where
S: Into<String>,
{
let mut parameters: BTreeMap<String, String> = BTreeMap::new();
parameters.insert("symbol".into(), symbol.into());
let request = build_request(parameters);
self.client
.get(API::Spot(Spot::Ticker24hr), Some(request))
.await }
pub async fn get_all_24h_price_stats(&self) -> Result<Vec<PriceStats>> {
self.client.get(API::Spot(Spot::Ticker24hr), None).await }
pub async fn get_agg_trades<S1, S2, S3, S4, S5>(
&self,
symbol: S1,
from_id: S2,
start_time: S3,
end_time: S4,
limit: S5,
) -> Result<Vec<AggTrade>>
where
S1: Into<String>,
S2: Into<Option<u64>>,
S3: Into<Option<u64>>,
S4: Into<Option<u64>>,
S5: Into<Option<u16>>,
{
let mut parameters: BTreeMap<String, String> = BTreeMap::new();
parameters.insert("symbol".into(), symbol.into());
if let Some(lt) = limit.into() {
parameters.insert("limit".into(), format!("{}", lt));
}
if let Some(st) = start_time.into() {
parameters.insert("startTime".into(), format!("{}", st));
}
if let Some(et) = end_time.into() {
parameters.insert("endTime".into(), format!("{}", et));
}
if let Some(fi) = from_id.into() {
parameters.insert("fromId".into(), format!("{}", fi));
}
let request = build_request(parameters);
self.client
.get(API::Spot(Spot::AggTrades), Some(request))
.await }
pub async fn get_klines<S1, S2, S3, S4, S5>(
&self,
symbol: S1,
interval: S2,
limit: S3,
start_time: S4,
end_time: S5,
) -> Result<KlineSummaries>
where
S1: Into<String>,
S2: Into<String>,
S3: Into<Option<u16>>,
S4: Into<Option<u64>>,
S5: Into<Option<u64>>,
{
let mut parameters: BTreeMap<String, String> = BTreeMap::new();
parameters.insert("symbol".into(), symbol.into());
parameters.insert("interval".into(), interval.into());
if let Some(lt) = limit.into() {
parameters.insert("limit".into(), format!("{}", lt));
}
if let Some(st) = start_time.into() {
parameters.insert("startTime".into(), format!("{}", st));
}
if let Some(et) = end_time.into() {
parameters.insert("endTime".into(), format!("{}", et));
}
let request = build_request(parameters);
let data: Vec<Vec<Value>> = self
.client
.get(API::Spot(Spot::Klines), Some(request))
.await?;
let klines = KlineSummaries::AllKlineSummaries(
data.iter()
.map(|row| row.try_into())
.collect::<Result<Vec<KlineSummary>>>()?,
);
Ok(klines)
}
}