sea_query/extension/postgres/
interval.rs

1use std::convert::TryFrom;
2use std::fmt;
3
4use crate::PgInterval;
5
6impl fmt::Display for PgInterval {
7    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
8        let fields = match self {
9            PgInterval::Year => "YEAR",
10            PgInterval::Month => "MONTH",
11            PgInterval::Day => "DAY",
12            PgInterval::Hour => "HOUR",
13            PgInterval::Minute => "MINUTE",
14            PgInterval::Second => "SECOND",
15            PgInterval::YearToMonth => "YEAR TO MONTH",
16            PgInterval::DayToHour => "DAY TO HOUR",
17            PgInterval::DayToMinute => "DAY TO MINUTE",
18            PgInterval::DayToSecond => "DAY TO SECOND",
19            PgInterval::HourToMinute => "HOUR TO MINUTE",
20            PgInterval::HourToSecond => "HOUR TO SECOND",
21            PgInterval::MinuteToSecond => "MINUTE TO SECOND",
22        };
23        write!(f, "{fields}")
24    }
25}
26
27impl TryFrom<String> for PgInterval {
28    type Error = String;
29
30    fn try_from(field: String) -> Result<Self, Self::Error> {
31        PgInterval::try_from(field.as_str())
32    }
33}
34
35impl TryFrom<&String> for PgInterval {
36    type Error = String;
37
38    fn try_from(field: &String) -> Result<Self, Self::Error> {
39        PgInterval::try_from(field.as_str())
40    }
41}
42
43impl TryFrom<&str> for PgInterval {
44    type Error = String;
45
46    fn try_from(field: &str) -> Result<Self, Self::Error> {
47        match field.trim_start().trim_end().to_uppercase().as_ref() {
48            "YEAR" => Ok(PgInterval::Year),
49            "MONTH" => Ok(PgInterval::Month),
50            "DAY" => Ok(PgInterval::Day),
51            "HOUR" => Ok(PgInterval::Hour),
52            "MINUTE" => Ok(PgInterval::Minute),
53            "SECOND" => Ok(PgInterval::Second),
54            "YEAR TO MONTH" => Ok(PgInterval::YearToMonth),
55            "DAY TO HOUR" => Ok(PgInterval::DayToHour),
56            "DAY TO MINUTE" => Ok(PgInterval::DayToMinute),
57            "DAY TO SECOND" => Ok(PgInterval::DayToSecond),
58            "HOUR TO MINUTE" => Ok(PgInterval::HourToMinute),
59            "HOUR TO SECOND" => Ok(PgInterval::HourToSecond),
60            "MINUTE TO SECOND" => Ok(PgInterval::MinuteToSecond),
61            field => Err(format!(
62                "Cannot turn \"{field}\" into a Postgres interval field",
63            )),
64        }
65    }
66}