use std::fmt;
use chrono::{DateTime, Utc};
use serde::Deserialize;
use crate::shared::models::price::Price;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum OhlcRange {
OneMinute,
ThreeMinutes,
FiveMinutes,
TenMinutes,
FifteenMinutes,
ThirtyMinutes,
FortyFiveMinutes,
OneHour,
TwoHours,
ThreeHours,
FourHours,
OneDay,
OneWeek,
OneMonth,
ThreeMonths,
}
impl fmt::Display for OhlcRange {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match self {
OhlcRange::OneMinute => "1m",
OhlcRange::ThreeMinutes => "3m",
OhlcRange::FiveMinutes => "5m",
OhlcRange::TenMinutes => "10m",
OhlcRange::FifteenMinutes => "15m",
OhlcRange::ThirtyMinutes => "30m",
OhlcRange::FortyFiveMinutes => "45m",
OhlcRange::OneHour => "1h",
OhlcRange::TwoHours => "2h",
OhlcRange::ThreeHours => "3h",
OhlcRange::FourHours => "4h",
OhlcRange::OneDay => "1d",
OhlcRange::OneWeek => "1w",
OhlcRange::OneMonth => "1month",
OhlcRange::ThreeMonths => "3months",
};
write!(f, "{}", s)
}
}
#[derive(Deserialize, Debug, Clone)]
pub struct OhlcCandle {
time: DateTime<Utc>,
open: Price,
high: Price,
low: Price,
close: Price,
volume: u64,
}
impl OhlcCandle {
pub fn time(&self) -> DateTime<Utc> {
self.time
}
pub fn open(&self) -> Price {
self.open
}
pub fn high(&self) -> Price {
self.high
}
pub fn low(&self) -> Price {
self.low
}
pub fn close(&self) -> Price {
self.close
}
pub fn volume(&self) -> u64 {
self.volume
}
pub fn as_data_str(&self) -> String {
format!(
"time: {}\nopen: {}\nhigh: {}\nlow: {}\nclose: {}\nvolume: {}",
self.time.to_rfc3339(),
self.open,
self.high,
self.low,
self.close,
self.volume
)
}
}
impl fmt::Display for OhlcCandle {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "OHLC Candle:")?;
for line in self.as_data_str().lines() {
write!(f, "\n {line}")?;
}
Ok(())
}
}