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
use std::convert::TryFrom;
use std::fmt;
use crate::IntervalField;
impl fmt::Display for IntervalField {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let fields = match self {
IntervalField::Year => "YEAR",
IntervalField::Month => "MONTH",
IntervalField::Day => "DAY",
IntervalField::Hour => "HOUR",
IntervalField::Minute => "MINUTE",
IntervalField::Second => "SECOND",
IntervalField::YearToMonth => "YEAR TO MONTH",
IntervalField::DayToHour => "DAY TO HOUR",
IntervalField::DayToMinute => "DAY TO MINUTE",
IntervalField::DayToSecond => "DAY TO SECOND",
IntervalField::HourToMinute => "HOUR TO MINUTE",
IntervalField::HourToSecond => "HOUR TO SECOND",
IntervalField::MinuteToSecond => "MINUTE TO SECOND",
};
write!(f, "{}", fields)
}
}
impl TryFrom<String> for IntervalField {
type Error = String;
fn try_from(field: String) -> Result<Self, Self::Error> {
IntervalField::try_from(field.as_str())
}
}
impl TryFrom<&String> for IntervalField {
type Error = String;
fn try_from(field: &String) -> Result<Self, Self::Error> {
IntervalField::try_from(field.as_str())
}
}
impl TryFrom<&str> for IntervalField {
type Error = String;
fn try_from(field: &str) -> Result<Self, Self::Error> {
match field.trim_start().trim_end().to_uppercase().as_ref() {
"YEAR" => Ok(IntervalField::Year),
"MONTH" => Ok(IntervalField::Month),
"DAY" => Ok(IntervalField::Day),
"HOUR" => Ok(IntervalField::Hour),
"MINUTE" => Ok(IntervalField::Minute),
"SECOND" => Ok(IntervalField::Second),
"YEAR TO MONTH" => Ok(IntervalField::YearToMonth),
"DAY TO HOUR" => Ok(IntervalField::DayToHour),
"DAY TO MINUTE" => Ok(IntervalField::DayToMinute),
"DAY TO SECOND" => Ok(IntervalField::DayToSecond),
"HOUR TO MINUTE" => Ok(IntervalField::HourToMinute),
"HOUR TO SECOND" => Ok(IntervalField::HourToSecond),
"MINUTE TO SECOND" => Ok(IntervalField::MinuteToSecond),
field => Err(format!(
"Cannot turn \"{}\" into a Postgres interval field",
field,
)),
}
}
}