use chrono::Utc; use num_traits::ToPrimitive; use serde::Serialize; use super::candle::Candle; #[derive(Serialize)] pub struct TvResponse { /// ok, error, no_data #[serde(rename(serialize = "s"))] pub status: String, #[serde(rename(serialize = "errmsg"), skip_serializing_if = "Option::is_none")] pub error_message: Option, pub time: Vec, pub close: Vec, pub open: Vec, pub high: Vec, pub low: Vec, pub volume: Vec, /// Only Some if s == no_data #[serde( rename(serialize = "nextTime"), skip_serializing_if = "Option::is_none" )] pub next_time: Option, } impl TvResponse { pub fn candles_to_tv(candles: Vec) -> Self { let mut time: Vec = Vec::new(); let mut close: Vec = Vec::new(); let mut open: Vec = Vec::new(); let mut low: Vec = Vec::new(); let mut high: Vec = Vec::new(); let mut volume: Vec = Vec::new(); for c in candles.into_iter() { time.push(chrono::DateTime::::timestamp(&c.start_time) as u64); close.push(c.close.to_f64().unwrap()); open.push(c.open.to_f64().unwrap()); high.push(c.high.to_f64().unwrap()); low.push(c.low.to_f64().unwrap()); volume.push(c.volume.to_u64().unwrap()); } // Debug checks assert_eq!(time.len(), close.len()); assert_eq!(close.len(), open.len()); assert_eq!(open.len(), low.len()); assert_eq!(low.len(), high.len()); assert_eq!(volume.len(), time.len()); TvResponse { status: "ok".to_owned(), error_message: None, time, close, open, low, high, volume, next_time: None, } } }