architect_api/marketdata/
candle_width.rs

1use anyhow::anyhow;
2use chrono::TimeDelta;
3use derive_more::Display;
4use schemars::JsonSchema_repr;
5use serde_repr::{Deserialize_repr, Serialize_repr};
6use std::str::FromStr;
7
8#[derive(
9    Debug,
10    Display,
11    Clone,
12    Copy,
13    PartialEq,
14    Eq,
15    PartialOrd,
16    Ord,
17    strum::EnumIter,
18    Hash,
19    Serialize_repr,
20    Deserialize_repr,
21    JsonSchema_repr,
22)]
23#[cfg_attr(feature = "juniper", derive(juniper::GraphQLEnum))]
24#[repr(i32)]
25pub enum CandleWidth {
26    OneSecond = 1,
27    FiveSecond = 5,
28    OneMinute = 60,
29    TwoMinute = 120,
30    ThreeMinute = 180,
31    FifteenMinute = 900,
32    OneHour = 3600,
33    OneDay = 86400,
34}
35
36impl CandleWidth {
37    pub fn all() -> Vec<Self> {
38        vec![
39            Self::OneSecond,
40            Self::FiveSecond,
41            Self::OneMinute,
42            Self::TwoMinute,
43            Self::ThreeMinute,
44            Self::FifteenMinute,
45            Self::OneHour,
46            Self::OneDay,
47        ]
48    }
49
50    pub fn as_str(&self) -> &'static str {
51        match self {
52            Self::OneSecond => "1s",
53            Self::FiveSecond => "5s",
54            Self::OneMinute => "1m",
55            Self::TwoMinute => "2m",
56            Self::ThreeMinute => "3m",
57            Self::FifteenMinute => "15m",
58            Self::OneHour => "1h",
59            Self::OneDay => "1d",
60        }
61    }
62
63    pub fn as_seconds(&self) -> i64 {
64        match self {
65            Self::OneSecond => 1,
66            Self::FiveSecond => 5,
67            Self::OneMinute => 60,
68            Self::TwoMinute => 120,
69            Self::ThreeMinute => 180,
70            Self::FifteenMinute => 900,
71            Self::OneHour => 3600,
72            Self::OneDay => 86400,
73        }
74    }
75}
76
77impl FromStr for CandleWidth {
78    type Err = anyhow::Error;
79
80    fn from_str(s: &str) -> Result<Self, Self::Err> {
81        match s {
82            "1s" => Ok(Self::OneSecond),
83            "5s" => Ok(Self::FiveSecond),
84            "1m" => Ok(Self::OneMinute),
85            "2m" => Ok(Self::TwoMinute),
86            "3m" => Ok(Self::ThreeMinute),
87            "15m" => Ok(Self::FifteenMinute),
88            "1h" => Ok(Self::OneHour),
89            "1d" => Ok(Self::OneDay),
90            _ => Err(anyhow!("invalid candle width: {}", s)),
91        }
92    }
93}
94
95impl From<CandleWidth> for TimeDelta {
96    fn from(val: CandleWidth) -> Self {
97        TimeDelta::seconds(val.as_seconds())
98    }
99}