zmanim 0.0.7

Hebrew Zmanim library
Documentation
use crate::prelude::tz::*;
use chrono::offset::{Offset, TimeZone};
use chrono::{Datelike, FixedOffset, NaiveDate, NaiveDateTime};
use chrono_tz::Etc::*;
use std::str::FromStr;
use strum_macros::EnumString;
#[derive(Debug, EnumString, Clone)]
#[non_exhaustive]
pub enum Etc {
    GMT,
    GMT0,
    #[strum(serialize = "GMT-0")]
    GMTMinus0,
    #[strum(serialize = "GMT-1")]
    GMTMinus1,
    #[strum(serialize = "GMT-2")]
    GMTMinus2,
    #[strum(serialize = "GMT-3")]
    GMTMinus3,
    #[strum(serialize = "GMT-4")]
    GMTMinus4,
    #[strum(serialize = "GMT-5")]
    GMTMinus5,
    #[strum(serialize = "GMT-6")]
    GMTMinus6,
    #[strum(serialize = "GMT-7")]
    GMTMinus7,
    #[strum(serialize = "GMT-8")]
    GMTMinus8,
    #[strum(serialize = "GMT-9")]
    GMTMinus9,
    #[strum(serialize = "GMT-10")]
    GMTMinus10,
    #[strum(serialize = "GMT-11")]
    GMTMinus11,
    #[strum(serialize = "GMT-12")]
    GMTMinus12,
    #[strum(serialize = "GMT-13")]
    GMTMinus13,
    #[strum(serialize = "GMT-14")]
    GMTMinus14,
    #[strum(serialize = "GMT+0")]
    GMTPlus0,
    #[strum(serialize = "GMT+1")]
    GMTPlus1,
    #[strum(serialize = "GMT+2")]
    GMTPlus2,
    #[strum(serialize = "GMT+3")]
    GMTPlus3,
    #[strum(serialize = "GMT+4")]
    GMTPlus4,
    #[strum(serialize = "GMT+5")]
    GMTPlus5,
    #[strum(serialize = "GMT+6")]
    GMTPlus6,
    #[strum(serialize = "GMT+7")]
    GMTPlus7,
    #[strum(serialize = "GMT+8")]
    GMTPlus8,
    #[strum(serialize = "GMT+9")]
    GMTPlus9,
    #[strum(serialize = "GMT+10")]
    GMTPlus10,
    #[strum(serialize = "GMT+11")]
    GMTPlus11,
    #[strum(serialize = "GMT+12")]
    GMTPlus12,
    Greenwich,
    UCT,
    UTC,
    Universal,
    Zulu,
}
impl Etc {
    pub(crate) fn try_from_path(p: &[&str]) -> Result<Self, Error> {
        if p.len() != 1 {
            return Err(Error::TooManyElements(p.len()));
        }
        Self::from_str(p[0]).map_err(|_| Error::WrongTimeZone(p[0].to_string()))
    }
    pub(crate) fn get_tz(&self, datetime: &NaiveDateTime) -> FixedOffset {
        let p = match self {
            Self::GMT => GMT.from_utc_datetime(datetime),
            Self::GMT0 => GMT0.from_utc_datetime(datetime),
            Self::GMTMinus0 => GMTMinus0.from_utc_datetime(datetime),
            Self::GMTMinus1 => GMTMinus1.from_utc_datetime(datetime),
            Self::GMTMinus2 => GMTMinus2.from_utc_datetime(datetime),
            Self::GMTMinus3 => GMTMinus3.from_utc_datetime(datetime),
            Self::GMTMinus4 => GMTMinus4.from_utc_datetime(datetime),
            Self::GMTMinus5 => GMTMinus5.from_utc_datetime(datetime),
            Self::GMTMinus6 => GMTMinus6.from_utc_datetime(datetime),
            Self::GMTMinus7 => GMTMinus7.from_utc_datetime(datetime),
            Self::GMTMinus8 => GMTMinus8.from_utc_datetime(datetime),
            Self::GMTMinus9 => GMTMinus9.from_utc_datetime(datetime),
            Self::GMTMinus10 => GMTMinus10.from_utc_datetime(datetime),
            Self::GMTMinus11 => GMTMinus11.from_utc_datetime(datetime),
            Self::GMTMinus12 => GMTMinus12.from_utc_datetime(datetime),
            Self::GMTMinus13 => GMTMinus13.from_utc_datetime(datetime),
            Self::GMTMinus14 => GMTMinus14.from_utc_datetime(datetime),
            Self::GMTPlus0 => GMTPlus0.from_utc_datetime(datetime),
            Self::GMTPlus1 => GMTPlus1.from_utc_datetime(datetime),
            Self::GMTPlus2 => GMTPlus2.from_utc_datetime(datetime),
            Self::GMTPlus3 => GMTPlus3.from_utc_datetime(datetime),
            Self::GMTPlus4 => GMTPlus4.from_utc_datetime(datetime),
            Self::GMTPlus5 => GMTPlus5.from_utc_datetime(datetime),
            Self::GMTPlus6 => GMTPlus6.from_utc_datetime(datetime),
            Self::GMTPlus7 => GMTPlus7.from_utc_datetime(datetime),
            Self::GMTPlus8 => GMTPlus8.from_utc_datetime(datetime),
            Self::GMTPlus9 => GMTPlus9.from_utc_datetime(datetime),
            Self::GMTPlus10 => GMTPlus10.from_utc_datetime(datetime),
            Self::GMTPlus11 => GMTPlus11.from_utc_datetime(datetime),
            Self::GMTPlus12 => GMTPlus12.from_utc_datetime(datetime),
            Self::Greenwich => Greenwich.from_utc_datetime(datetime),
            Self::UCT => UCT.from_utc_datetime(datetime),
            Self::UTC => UTC.from_utc_datetime(datetime),
            Self::Universal => Universal.from_utc_datetime(datetime),
            Self::Zulu => Zulu.from_utc_datetime(datetime),
        };
        p.timezone()
            .offset_from_utc_date(&NaiveDate::from_ymd(
                datetime.year(),
                datetime.month(),
                datetime.day(),
            ))
            .fix()
    }
}