1use crate::client::Client;
2use crate::errors::*;
3use crate::model;
4
5#[derive(Clone)]
6pub struct MarketsClient {
7 client: Client,
8}
9
10impl MarketsClient {
11 pub fn new() -> Self {
12 MarketsClient {
13 client: Client::new(None, None),
14 }
15 }
16
17 pub fn get_markets(&self) -> Result<Vec<model::MarketInfo>> {
18 let data = self.client.get("/markets".into(), "".into())?;
19 let markets: model::ResultData<Vec<model::MarketInfo>> =
20 serde_json::from_str(data.as_str())?;
21 Ok(markets.result)
22 }
23
24 pub fn get_market<S>(&self, symbol: S) -> Result<model::MarketInfo>
25 where
26 S: Into<String>,
27 {
28 let endpoint: String = format!("/markets/{}", symbol.into());
29 let data = self.client.get(endpoint, "".into())?;
30 let market: model::ResultData<model::MarketInfo> = serde_json::from_str(data.as_str())?;
31 Ok(market.result)
32 }
33
34 pub fn get_orderbook<S, D>(&self, symbol: S, depth: D) -> Result<model::Depth>
36 where
37 S: Into<String>,
38 D: Into<i64>,
39 {
40 let endpoint: String = format!(
41 "/markets/{}/orderbook?depth={}",
42 symbol.into(),
43 depth.into()
44 );
45 let data = self.client.get(endpoint, "".into())?;
46 let depth: model::ResultData<model::Depth> = serde_json::from_str(data.as_str())?;
47 Ok(depth.result)
48 }
49
50 pub fn get_trades<S>(&self, symbol: S) -> Result<Vec<model::TradeInfo>>
51 where
52 S: Into<String>,
53 {
54 let endpoint: String = format!("/markets/{}/trades", symbol.into());
55 let data = self.client.get(endpoint, "".into())?;
56 let trades: model::ResultData<Vec<model::TradeInfo>> = serde_json::from_str(data.as_str())?;
57 Ok(trades.result)
58 }
59
60 pub fn get_historical_prices<S, R, ST, ET>(
61 &self,
62 symbol: S,
63 resolution: R,
64 start_time: ST,
65 end_time: ET,
66 ) -> Result<Vec<model::CandleInfo>>
67 where
68 S: Into<String>,
69 R: Into<i64>,
70 ST: Into<i64>,
71 ET: Into<i64>,
72 {
73 let endpoint: String = format!(
74 "/markets/{}/candles?resolution={}&start_time={}&end_time={}",
75 symbol.into(),
76 resolution.into(),
77 start_time.into(),
78 end_time.into()
79 );
80 let data = self.client.get(endpoint, "".into())?;
81 let candles: model::ResultData<Vec<model::CandleInfo>> =
82 serde_json::from_str(data.as_str())?;
83 Ok(candles.result)
84 }
85}
86
87#[cfg(test)]
88mod tests {
89 use super::*;
90 #[test]
91 fn test_get_market() {
92 let client = MarketsClient::new();
93 let ticker = client.get_market("BTC-PERP");
94 println!("{:#?}", ticker);
95 }
96}