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