architect_api/marketdata/
candle_width.rs

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