use super::*;
use anyhow::{anyhow as err, Error};
use std::collections::HashMap;
pub struct Markets<'a> {
rest: &'a RestClient,
}
impl<'a> Markets<'a> {
pub(crate) fn new(rest: &'a RestClient) -> Self {
Self { rest }
}
#[deprecated(since = "0.3.0", note = "Use `get_perpetual_markets` instead")]
pub async fn list_perpetual_markets(
&self,
opts: Option<ListPerpetualMarketsOpts>,
) -> Result<HashMap<Ticker, PerpetualMarket>, Error> {
self.get_perpetual_markets(opts).await
}
pub async fn get_perpetual_markets(
&self,
opts: Option<ListPerpetualMarketsOpts>,
) -> Result<HashMap<Ticker, PerpetualMarket>, Error> {
let rest = &self.rest;
const URI: &str = "/v4/perpetualMarkets";
let url = format!("{}{URI}", rest.config.endpoint);
let options = opts.unwrap_or_default();
let markets = rest
.client
.get(url)
.query(&options)
.send()
.await?
.error_for_status()?
.json::<PerpetualMarketResponse>()
.await?
.markets;
Ok(markets)
}
pub async fn get_perpetual_market(&self, ticker: &Ticker) -> Result<PerpetualMarket, Error> {
let mut markets = self
.get_perpetual_markets(Some(ListPerpetualMarketsOpts {
limit: Some(1),
ticker: Some(ticker.clone()),
}))
.await?;
markets
.remove(ticker)
.ok_or_else(|| err!("Market ticker not found in list Markets response"))
}
pub async fn get_perpetual_market_orderbook(
&self,
ticker: &Ticker,
) -> Result<OrderBookResponseObject, Error> {
let rest = &self.rest;
const URI: &str = "/v4/orderbooks/perpetualMarket";
let url = format!("{}{URI}/{ticker}", rest.config.endpoint);
let orderbook = rest
.client
.get(url)
.send()
.await?
.error_for_status()?
.json()
.await?;
Ok(orderbook)
}
#[deprecated(since = "0.3.0", note = "Use `get_perpetual_market_trades` instead")]
pub async fn get_trades(
&self,
ticker: &Ticker,
opts: Option<GetTradesOpts>,
) -> Result<Vec<TradeResponseObject>, Error> {
self.get_perpetual_market_trades(ticker, opts).await
}
pub async fn get_perpetual_market_trades(
&self,
ticker: &Ticker,
opts: Option<GetTradesOpts>,
) -> Result<Vec<TradeResponseObject>, Error> {
let rest = &self.rest;
const URI: &str = "/v4/trades/perpetualMarket";
let url = format!("{}{URI}/{ticker}", rest.config.endpoint);
let options = opts.unwrap_or_default();
let trades = rest
.client
.get(url)
.query(&options)
.send()
.await?
.error_for_status()?
.json::<TradeResponse>()
.await?
.trades;
Ok(trades)
}
#[deprecated(since = "0.3.0", note = "Use `get_perpetual_market_candles` instead")]
pub async fn get_candles(
&self,
ticker: &Ticker,
res: CandleResolution,
opts: Option<GetCandlesOpts>,
) -> Result<Vec<CandleResponseObject>, Error> {
self.get_perpetual_market_candles(ticker, res, opts).await
}
pub async fn get_perpetual_market_candles(
&self,
ticker: &Ticker,
res: CandleResolution,
opts: Option<GetCandlesOpts>,
) -> Result<Vec<CandleResponseObject>, Error> {
let rest = &self.rest;
const URI: &str = "/v4/candles/perpetualMarkets";
let url = format!("{}{URI}/{ticker}", rest.config.endpoint);
let options = opts.unwrap_or_default();
let candles = rest
.client
.get(url)
.query(&[("resolution", &res)])
.query(&options)
.send()
.await?
.error_for_status()?
.json::<CandleResponse>()
.await?
.candles;
Ok(candles)
}
#[deprecated(
since = "0.3.0",
note = "Use `get_perpetual_market_historical_funding` instead"
)]
pub async fn get_historical_funding(
&self,
ticker: &Ticker,
opts: Option<GetHistoricalFundingOpts>,
) -> Result<Vec<HistoricalFundingResponseObject>, Error> {
self.get_perpetual_market_historical_funding(ticker, opts)
.await
}
pub async fn get_perpetual_market_historical_funding(
&self,
ticker: &Ticker,
opts: Option<GetHistoricalFundingOpts>,
) -> Result<Vec<HistoricalFundingResponseObject>, Error> {
let rest = &self.rest;
const URI: &str = "/v4/historicalFunding";
let url = format!("{}{URI}/{ticker}", rest.config.endpoint);
let options = opts.unwrap_or_default();
let funding = rest
.client
.get(url)
.query(&options)
.send()
.await?
.error_for_status()?
.json::<HistoricalFundingResponse>()
.await?
.historical_funding;
Ok(funding)
}
#[deprecated(
since = "0.3.0",
note = "Use `get_perpetual_market_sparklines` instead"
)]
pub async fn get_sparklines(
&self,
period: SparklineTimePeriod,
) -> Result<SparklineResponseObject, Error> {
self.get_perpetual_market_sparklines(period).await
}
pub async fn get_perpetual_market_sparklines(
&self,
period: SparklineTimePeriod,
) -> Result<SparklineResponseObject, Error> {
let rest = &self.rest;
const URI: &str = "/v4/sparklines";
let url = format!("{}{URI}", rest.config.endpoint);
let sparklines = rest
.client
.get(url)
.query(&[("timePeriod", &period)])
.send()
.await?
.error_for_status()?
.json()
.await?;
Ok(sparklines)
}
}