1#[allow(unused_imports)]
4use super::*;
5#[allow(unused_imports)]
6use crate::ids::*;
7#[allow(unused_imports)]
8use crate::timestamp::Timestamp;
9#[allow(unused_imports)]
10use rust_decimal::Decimal;
11#[allow(unused_imports)]
12use serde::{Deserialize, Serialize};
13
14#[derive(Debug, Clone, PartialEq, Eq, Hash)]
16#[non_exhaustive]
17pub enum CandlestickGranularity {
18 S5,
20 S10,
22 S15,
24 S30,
26 M1,
28 M2,
30 M4,
32 M5,
34 M10,
36 M15,
38 M30,
40 H1,
42 H2,
44 H3,
46 H4,
48 H6,
50 H8,
52 H12,
54 D,
56 W,
58 M,
60 Unknown(String),
62}
63
64impl CandlestickGranularity {
65 pub fn as_str(&self) -> &str {
67 match self {
68 Self::S5 => "S5",
69 Self::S10 => "S10",
70 Self::S15 => "S15",
71 Self::S30 => "S30",
72 Self::M1 => "M1",
73 Self::M2 => "M2",
74 Self::M4 => "M4",
75 Self::M5 => "M5",
76 Self::M10 => "M10",
77 Self::M15 => "M15",
78 Self::M30 => "M30",
79 Self::H1 => "H1",
80 Self::H2 => "H2",
81 Self::H3 => "H3",
82 Self::H4 => "H4",
83 Self::H6 => "H6",
84 Self::H8 => "H8",
85 Self::H12 => "H12",
86 Self::D => "D",
87 Self::W => "W",
88 Self::M => "M",
89 Self::Unknown(value) => value,
90 }
91 }
92}
93
94impl Serialize for CandlestickGranularity {
95 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
96 serializer.serialize_str(self.as_str())
97 }
98}
99
100impl<'de> Deserialize<'de> for CandlestickGranularity {
101 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
102 let value = String::deserialize(deserializer)?;
103 Ok(match value.as_str() {
104 "S5" => Self::S5,
105 "S10" => Self::S10,
106 "S15" => Self::S15,
107 "S30" => Self::S30,
108 "M1" => Self::M1,
109 "M2" => Self::M2,
110 "M4" => Self::M4,
111 "M5" => Self::M5,
112 "M10" => Self::M10,
113 "M15" => Self::M15,
114 "M30" => Self::M30,
115 "H1" => Self::H1,
116 "H2" => Self::H2,
117 "H3" => Self::H3,
118 "H4" => Self::H4,
119 "H6" => Self::H6,
120 "H8" => Self::H8,
121 "H12" => Self::H12,
122 "D" => Self::D,
123 "W" => Self::W,
124 "M" => Self::M,
125 _ => Self::Unknown(value),
126 })
127 }
128}
129
130#[derive(Debug, Clone, PartialEq, Eq, Hash)]
132#[non_exhaustive]
133pub enum WeeklyAlignment {
134 Monday,
136 Tuesday,
138 Wednesday,
140 Thursday,
142 Friday,
144 Saturday,
146 Sunday,
148 Unknown(String),
150}
151
152impl WeeklyAlignment {
153 pub fn as_str(&self) -> &str {
155 match self {
156 Self::Monday => "Monday",
157 Self::Tuesday => "Tuesday",
158 Self::Wednesday => "Wednesday",
159 Self::Thursday => "Thursday",
160 Self::Friday => "Friday",
161 Self::Saturday => "Saturday",
162 Self::Sunday => "Sunday",
163 Self::Unknown(value) => value,
164 }
165 }
166}
167
168impl Serialize for WeeklyAlignment {
169 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
170 serializer.serialize_str(self.as_str())
171 }
172}
173
174impl<'de> Deserialize<'de> for WeeklyAlignment {
175 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
176 let value = String::deserialize(deserializer)?;
177 Ok(match value.as_str() {
178 "Monday" => Self::Monday,
179 "Tuesday" => Self::Tuesday,
180 "Wednesday" => Self::Wednesday,
181 "Thursday" => Self::Thursday,
182 "Friday" => Self::Friday,
183 "Saturday" => Self::Saturday,
184 "Sunday" => Self::Sunday,
185 _ => Self::Unknown(value),
186 })
187 }
188}
189
190#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
192#[serde(rename_all = "camelCase")]
193pub struct Candlestick {
194 #[serde(rename = "time", default, skip_serializing_if = "Option::is_none")]
196 pub time: Option<Timestamp>,
197 #[serde(rename = "bid", default, skip_serializing_if = "Option::is_none")]
199 pub bid: Option<CandlestickData>,
200 #[serde(rename = "ask", default, skip_serializing_if = "Option::is_none")]
202 pub ask: Option<CandlestickData>,
203 #[serde(rename = "mid", default, skip_serializing_if = "Option::is_none")]
205 pub mid: Option<CandlestickData>,
206 #[serde(rename = "volume", default, skip_serializing_if = "Option::is_none")]
208 pub volume: Option<i64>,
209 #[serde(rename = "complete", default, skip_serializing_if = "Option::is_none")]
212 pub complete: Option<bool>,
213}
214
215#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
217#[serde(rename_all = "camelCase")]
218pub struct CandlestickData {
219 #[serde(rename = "o", default, skip_serializing_if = "Option::is_none")]
221 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
222 pub o: Option<Decimal>,
223 #[serde(rename = "h", default, skip_serializing_if = "Option::is_none")]
225 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
226 pub h: Option<Decimal>,
227 #[serde(rename = "l", default, skip_serializing_if = "Option::is_none")]
229 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
230 pub l: Option<Decimal>,
231 #[serde(rename = "c", default, skip_serializing_if = "Option::is_none")]
233 #[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
234 pub c: Option<Decimal>,
235}
236
237#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
239#[serde(rename_all = "camelCase")]
240pub struct CandlestickResponse {
241 #[serde(
243 rename = "instrument",
244 default,
245 skip_serializing_if = "Option::is_none"
246 )]
247 pub instrument: Option<InstrumentName>,
248 #[serde(
250 rename = "granularity",
251 default,
252 skip_serializing_if = "Option::is_none"
253 )]
254 pub granularity: Option<CandlestickGranularity>,
255 #[serde(rename = "candles", default, skip_serializing_if = "Option::is_none")]
257 pub candles: Option<Vec<Candlestick>>,
258}