architect_api/marketdata/
candle_width.rs1use 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}