use chrono::{DateTime, Utc};
use serde::Deserialize;
#[derive(Debug, Clone, PartialEq)]
pub struct Candle {
pub time: DateTime<Utc>,
pub open: f64,
pub high: f64,
pub low: f64,
pub close: f64,
pub volume: u64,
pub open_interest: Option<f64>,
}
#[derive(serde::Deserialize)]
struct RawCandle(
i64, f64, f64, f64, f64, u64, #[serde(default)] Option<f64>, );
impl<'de> serde::Deserialize<'de> for Candle {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let raw = RawCandle::deserialize(deserializer)?;
Ok(Candle {
time: chrono::DateTime::from_timestamp(raw.0, 0)
.ok_or_else(|| serde::de::Error::custom("invalid timestamp"))?,
open: raw.1,
high: raw.2,
low: raw.3,
close: raw.4,
volume: raw.5,
open_interest: raw.6,
})
}
}
#[derive(Debug, Deserialize)]
pub(crate) struct HistoryResponse {
pub(crate) candles: Vec<Candle>,
}