Skip to main content

ftx_rs/
markets.rs

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    // depth -> max 100, default 20
35    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}