1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
use chrono::Duration;
use serde::Deserialize;
use serde::Serialize;
use std::convert::TryFrom;
use crate::{OpenLimitsError, Result};
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq)]
pub enum Interval {
#[serde(rename = "1m")]
OneMinute,
#[serde(rename = "3m")]
ThreeMinutes,
#[serde(rename = "5m")]
FiveMinutes,
#[serde(rename = "15m")]
FifteenMinutes,
#[serde(rename = "30m")]
ThirtyMinutes,
#[serde(rename = "1h")]
OneHour,
#[serde(rename = "2h")]
TwoHours,
#[serde(rename = "4h")]
FourHours,
#[serde(rename = "6h")]
SixHours,
#[serde(rename = "8h")]
EightHours,
#[serde(rename = "12h")]
TwelveHours,
#[serde(rename = "1d")]
OneDay,
#[serde(rename = "3d")]
ThreeDays,
#[serde(rename = "1w")]
OneWeek,
#[serde(rename = "1mo")]
OneMonth,
}
impl Into<Duration> for Interval {
fn into(self) -> Duration {
match self {
Self::OneMinute => Duration::minutes(1),
Self::ThreeMinutes => Duration::minutes(3),
Self::FiveMinutes => Duration::minutes(5),
Self::FifteenMinutes => Duration::minutes(15),
Self::ThirtyMinutes => Duration::minutes(30),
Self::OneHour => Duration::hours(1),
Self::TwoHours => Duration::hours(2),
Self::FourHours => Duration::hours(4),
Self::SixHours => Duration::hours(6),
Self::EightHours => Duration::hours(8),
Self::TwelveHours => Duration::hours(12),
Self::OneDay => Duration::days(1),
Self::ThreeDays => Duration::days(3),
Self::OneWeek => Duration::weeks(1),
Self::OneMonth => Duration::days(30),
}
}
}
impl Interval {
pub fn to_duration(self) -> Duration {
self.into()
}
}
impl TryFrom<Interval> for u32 {
type Error = OpenLimitsError;
fn try_from(value: Interval) -> Result<Self> {
match value {
Interval::OneMinute => Ok(60),
Interval::FiveMinutes => Ok(300),
Interval::FifteenMinutes => Ok(900),
Interval::OneHour => Ok(3600),
Interval::SixHours => Ok(21600),
Interval::OneDay => Ok(86400),
_ => Err(OpenLimitsError::MissingParameter(format!(
"{:?} is not supported in Coinbase",
value,
))),
}
}
}
impl From<Interval> for &str {
fn from(interval: Interval) -> Self {
match interval {
Interval::OneMinute => "1m",
Interval::ThreeMinutes => "3m",
Interval::FiveMinutes => "5m",
Interval::FifteenMinutes => "15m",
Interval::ThirtyMinutes => "30m",
Interval::OneHour => "1h",
Interval::TwoHours => "2h",
Interval::FourHours => "4h",
Interval::SixHours => "6h",
Interval::EightHours => "8h",
Interval::TwelveHours => "12h",
Interval::OneDay => "1d",
Interval::ThreeDays => "3d",
Interval::OneWeek => "1w",
Interval::OneMonth => "1M",
}
}
}