#[allow(unused_imports)]
use super::*;
#[allow(unused_imports)]
use crate::ids::*;
#[allow(unused_imports)]
use crate::timestamp::Timestamp;
#[allow(unused_imports)]
use rust_decimal::Decimal;
#[allow(unused_imports)]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum CandlestickGranularity {
S5,
S10,
S15,
S30,
M1,
M2,
M4,
M5,
M10,
M15,
M30,
H1,
H2,
H3,
H4,
H6,
H8,
H12,
D,
W,
M,
Unknown(String),
}
impl CandlestickGranularity {
pub fn as_str(&self) -> &str {
match self {
Self::S5 => "S5",
Self::S10 => "S10",
Self::S15 => "S15",
Self::S30 => "S30",
Self::M1 => "M1",
Self::M2 => "M2",
Self::M4 => "M4",
Self::M5 => "M5",
Self::M10 => "M10",
Self::M15 => "M15",
Self::M30 => "M30",
Self::H1 => "H1",
Self::H2 => "H2",
Self::H3 => "H3",
Self::H4 => "H4",
Self::H6 => "H6",
Self::H8 => "H8",
Self::H12 => "H12",
Self::D => "D",
Self::W => "W",
Self::M => "M",
Self::Unknown(value) => value,
}
}
}
impl Serialize for CandlestickGranularity {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for CandlestickGranularity {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = String::deserialize(deserializer)?;
Ok(match value.as_str() {
"S5" => Self::S5,
"S10" => Self::S10,
"S15" => Self::S15,
"S30" => Self::S30,
"M1" => Self::M1,
"M2" => Self::M2,
"M4" => Self::M4,
"M5" => Self::M5,
"M10" => Self::M10,
"M15" => Self::M15,
"M30" => Self::M30,
"H1" => Self::H1,
"H2" => Self::H2,
"H3" => Self::H3,
"H4" => Self::H4,
"H6" => Self::H6,
"H8" => Self::H8,
"H12" => Self::H12,
"D" => Self::D,
"W" => Self::W,
"M" => Self::M,
_ => Self::Unknown(value),
})
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum WeeklyAlignment {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday,
Unknown(String),
}
impl WeeklyAlignment {
pub fn as_str(&self) -> &str {
match self {
Self::Monday => "Monday",
Self::Tuesday => "Tuesday",
Self::Wednesday => "Wednesday",
Self::Thursday => "Thursday",
Self::Friday => "Friday",
Self::Saturday => "Saturday",
Self::Sunday => "Sunday",
Self::Unknown(value) => value,
}
}
}
impl Serialize for WeeklyAlignment {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for WeeklyAlignment {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = String::deserialize(deserializer)?;
Ok(match value.as_str() {
"Monday" => Self::Monday,
"Tuesday" => Self::Tuesday,
"Wednesday" => Self::Wednesday,
"Thursday" => Self::Thursday,
"Friday" => Self::Friday,
"Saturday" => Self::Saturday,
"Sunday" => Self::Sunday,
_ => Self::Unknown(value),
})
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Candlestick {
#[serde(rename = "time", default, skip_serializing_if = "Option::is_none")]
pub time: Option<Timestamp>,
#[serde(rename = "bid", default, skip_serializing_if = "Option::is_none")]
pub bid: Option<CandlestickData>,
#[serde(rename = "ask", default, skip_serializing_if = "Option::is_none")]
pub ask: Option<CandlestickData>,
#[serde(rename = "mid", default, skip_serializing_if = "Option::is_none")]
pub mid: Option<CandlestickData>,
#[serde(rename = "volume", default, skip_serializing_if = "Option::is_none")]
pub volume: Option<i64>,
#[serde(rename = "complete", default, skip_serializing_if = "Option::is_none")]
pub complete: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CandlestickData {
#[serde(rename = "o", default, skip_serializing_if = "Option::is_none")]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub o: Option<Decimal>,
#[serde(rename = "h", default, skip_serializing_if = "Option::is_none")]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub h: Option<Decimal>,
#[serde(rename = "l", default, skip_serializing_if = "Option::is_none")]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub l: Option<Decimal>,
#[serde(rename = "c", default, skip_serializing_if = "Option::is_none")]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub c: Option<Decimal>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CandlestickResponse {
#[serde(
rename = "instrument",
default,
skip_serializing_if = "Option::is_none"
)]
pub instrument: Option<InstrumentName>,
#[serde(
rename = "granularity",
default,
skip_serializing_if = "Option::is_none"
)]
pub granularity: Option<CandlestickGranularity>,
#[serde(rename = "candles", default, skip_serializing_if = "Option::is_none")]
pub candles: Option<Vec<Candlestick>>,
}