exc_binance/http/request/
candle.rs

1use serde::Serialize;
2
3use super::{Rest, RestEndpoint, RestError};
4
5/// Intervals.
6#[derive(Debug, Clone, Copy, Serialize)]
7pub enum Interval {
8    /// 1 minute.
9    #[serde(rename = "1m")]
10    M1,
11    /// 3 minutes.
12    #[serde(rename = "3m")]
13    M3,
14    /// 5 minutes.
15    #[serde(rename = "5m")]
16    M5,
17    /// 15 minutes.
18    #[serde(rename = "15m")]
19    M15,
20    /// 30 mintues.
21    #[serde(rename = "30m")]
22    M30,
23    /// 1 hour.
24    #[serde(rename = "1h")]
25    H1,
26    /// 2 hours.
27    #[serde(rename = "2h")]
28    H2,
29    /// 4 hours.
30    #[serde(rename = "4h")]
31    H4,
32    /// 6 hours.
33    #[serde(rename = "6h")]
34    H6,
35    /// 8 hours.
36    #[serde(rename = "8h")]
37    H8,
38    /// 12 hours.
39    #[serde(rename = "12h")]
40    H12,
41    /// 1 day.
42    #[serde(rename = "1d")]
43    D1,
44    /// 3 days.
45    #[serde(rename = "3d")]
46    D3,
47    /// 1 week.
48    #[serde(rename = "1w")]
49    W1,
50    /// 1 month.
51    #[serde(rename = "1M")]
52    Mon1,
53}
54
55/// Query candles.
56#[derive(Debug, Clone, Serialize)]
57#[serde(rename_all = "camelCase")]
58pub struct QueryCandles {
59    /// Instrument.
60    pub symbol: String,
61    /// Interval.
62    pub interval: Interval,
63    /// Start time.
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub start_time: Option<i64>,
66    /// End time.
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub end_time: Option<i64>,
69    /// Limit.
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub limit: Option<usize>,
72}
73
74impl Rest for QueryCandles {
75    fn method(&self, _endpoint: &RestEndpoint) -> Result<http::Method, RestError> {
76        Ok(http::Method::GET)
77    }
78
79    fn to_path(&self, endpoint: &RestEndpoint) -> Result<String, RestError> {
80        let qs = serde_urlencoded::to_string(self)?;
81        match endpoint {
82            RestEndpoint::UsdMarginFutures => Ok(format!("/fapi/v1/klines?{qs}")),
83            RestEndpoint::Spot(_) => Ok(format!("/api/v3/klines?{qs}")),
84            RestEndpoint::EuropeanOptions => Ok(format!("/eapi/v1/klines?{qs}")),
85        }
86    }
87
88    fn to_payload(&self) -> super::Payload {
89        super::Payload::new(self.clone())
90    }
91}