zmanim 0.0.7

Hebrew Zmanim library
Documentation
use crate::prelude::tz::africa::Africa;
use crate::prelude::tz::america::America;
use crate::prelude::tz::antarctica::Antarctica;
use crate::prelude::tz::arctic::Arctic;
use crate::prelude::tz::asia::Asia;
use crate::prelude::tz::atlantic::Atlantic;
use crate::prelude::tz::australia::Australia;
use crate::prelude::tz::brazil::Brazil;
use crate::prelude::tz::canada::Canada;
use crate::prelude::tz::chile::Chile;
use crate::prelude::tz::etc::Etc;
use crate::prelude::tz::europe::Europe;
use crate::prelude::tz::indian::Indian;
use crate::prelude::tz::mexico::Mexico;
use crate::prelude::tz::pacific::Pacific;
use crate::prelude::tz::us::US;
use chrono::{FixedOffset, NaiveDateTime};
use serde::Deserialize;
use std::convert::TryFrom;
use std::fmt;
pub mod africa;
pub mod america;
pub mod antarctica;
pub mod arctic;
pub mod asia;
pub mod atlantic;
pub mod australia;
pub mod brazil;
pub mod canada;
pub mod chile;
pub mod etc;
pub mod europe;
pub mod indian;
pub mod mexico;
pub mod pacific;
pub mod us;
#[derive(Deserialize, Debug, Clone)]
#[serde(try_from = "&str")]
#[non_exhaustive]
pub enum TimeZone {
    Africa(africa::Africa),
    America(america::America),
    Antarctica(antarctica::Antarctica),
    Arctic(arctic::Arctic),
    Asia(asia::Asia),
    Atlantic(atlantic::Atlantic),
    Australia(australia::Australia),
    Brazil(brazil::Brazil),
    Canada(canada::Canada),
    Chile(chile::Chile),
    Etc(etc::Etc),
    Europe(europe::Europe),
    Indian(indian::Indian),
    Mexico(mexico::Mexico),
    Pacific(pacific::Pacific),
    US(us::US),
    CET,
    CST6CDT,
    Cuba,
    EET,
    Egypt,
    Eire,
    EST,
    EST5EDT,
    Factory,
    GB,
    GBEire,
    GMT,
    GMTPlus0,
    GMT0,
    GMTMinus0,
    Greenwich,
    Hongkong,
    HST,
    Iceland,
    Iran,
    Israel,
    Jamaica,
    Japan,
    Kwajalein,
    Libya,
    MET,
    MST,
    MST7MDT,
    Navajo,
    NZ,
    NZCHAT,
    Poland,
    Portugal,
    PRC,
    PST8PDT,
    ROC,
    ROK,
    Singapore,
    Turkey,
    UCT,
    Universal,
    UTC,
    WET,
    WSu,
    Zulu,
}
#[derive(Debug)]
#[non_exhaustive]
pub enum Error {
    WrongTimeZone(String),
    TooManyElements(usize),
}
impl fmt::Display for Error {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Self::WrongTimeZone(wtz) => write!(f, "TimeZone \"{}\" not understood", wtz),
            Self::TooManyElements(e) => write!(f, "TimeZone nested too deeply (\"{}\")", e),
        }
    }
}
impl TimeZone {
    pub(crate) fn get_tz(&self, datetime: &NaiveDateTime) -> FixedOffset {
        match self {
            Self::Africa(africa) => africa.get_tz(datetime),
            Self::America(america) => america.get_tz(datetime),
            Self::Antarctica(antarctica) => antarctica.get_tz(datetime),
            Self::Arctic(arctic) => arctic.get_tz(datetime),
            Self::Asia(asia) => asia.get_tz(datetime),
            Self::Atlantic(atlantic) => atlantic.get_tz(datetime),
            Self::Australia(australia) => australia.get_tz(datetime),
            Self::Brazil(brazil) => brazil.get_tz(datetime),
            Self::Canada(canada) => canada.get_tz(datetime),
            Self::Chile(chile) => chile.get_tz(datetime),
            Self::Etc(etc) => etc.get_tz(datetime),
            Self::Europe(europe) => europe.get_tz(datetime),
            Self::Indian(indian) => indian.get_tz(datetime),
            Self::Mexico(mexico) => mexico.get_tz(datetime),
            Self::Pacific(pacific) => pacific.get_tz(datetime),
            Self::US(us) => us.get_tz(datetime),
            _ => {
                todo!();
            }
        }
    }
}
impl TryFrom<&str> for TimeZone {
    type Error = Error;
    fn try_from(value: &str) -> Result<Self, Self::Error> {
        let p: Vec<&str> = value.split('/').collect();
        match p[0] {
            "Africa" => Ok(Self::Africa(Africa::try_from_path(&p[1..])?)),
            "America" => Ok(Self::America(America::try_from_path(&p[1..])?)),
            "Antarctica" => Ok(Self::Antarctica(Antarctica::try_from_path(&p[1..])?)),
            "Arctic" => Ok(Self::Arctic(Arctic::try_from_path(&p[1..])?)),
            "Asia" => Ok(Self::Asia(Asia::try_from_path(&p[1..])?)),
            "Atlantic" => Ok(Self::Atlantic(Atlantic::try_from_path(&p[1..])?)),
            "Australia" => Ok(Self::Australia(Australia::try_from_path(&p[1..])?)),
            "Brazil" => Ok(Self::Brazil(Brazil::try_from_path(&p[1..])?)),
            "Canada" => Ok(Self::Canada(Canada::try_from_path(&p[1..])?)),
            "Chile" => Ok(Self::Chile(Chile::try_from_path(&p[1..])?)),
            "Etc" => Ok(Self::Etc(Etc::try_from_path(&p[1..])?)),
            "Europe" => Ok(Self::Europe(Europe::try_from_path(&p[1..])?)),
            "Indian" => Ok(Self::Indian(Indian::try_from_path(&p[1..])?)),
            "Mexico" => Ok(Self::Mexico(Mexico::try_from_path(&p[1..])?)),
            "Pacific" => Ok(Self::Pacific(Pacific::try_from_path(&p[1..])?)),
            "US" => Ok(Self::US(US::try_from_path(&p[1..])?)),
            "CET" => Ok(Self::CET),
            "Cuba" => Ok(Self::Cuba),
            "CST6CDT" => Ok(Self::CST6CDT),
            "EET" => Ok(Self::EET),
            "Egypt" => Ok(Self::Egypt),
            "Eire" => Ok(Self::Eire),
            "EST" => Ok(Self::EST),
            "EST5EDT" => Ok(Self::EST5EDT),
            "Factory" => Ok(Self::Factory),
            "GB" => Ok(Self::GB),
            "GB-Eire" => Ok(Self::GBEire),
            "GMT" => Ok(Self::GMT),
            "GMT+0" => Ok(Self::GMTPlus0),
            "GMT0" => Ok(Self::GMT0),
            "GMT-0" => Ok(Self::GMTMinus0),
            "Greenwich" => Ok(Self::Greenwich),
            "Hongkong" => Ok(Self::Hongkong),
            "HST" => Ok(Self::HST),
            "Iceland" => Ok(Self::Iceland),
            "Iran" => Ok(Self::Iran),
            "Israel" => Ok(Self::Israel),
            "Jamaica" => Ok(Self::Jamaica),
            "Japan" => Ok(Self::Japan),
            "Kwajalein" => Ok(Self::Kwajalein),
            "Libya" => Ok(Self::Libya),
            "MET" => Ok(Self::MET),
            "MST" => Ok(Self::MST),
            "MST7MDT" => Ok(Self::MST7MDT),
            "Navajo" => Ok(Self::Navajo),
            "NZ" => Ok(Self::NZ),
            "NZ-CHAT" => Ok(Self::NZCHAT),
            "Poland" => Ok(Self::Poland),
            "Portugal" => Ok(Self::Portugal),
            "PRC" => Ok(Self::PRC),
            "PST8PDT" => Ok(Self::PST8PDT),
            "ROC" => Ok(Self::ROC),
            "ROK" => Ok(Self::ROK),
            "Singapore" => Ok(Self::Singapore),
            "Turkey" => Ok(Self::Turkey),
            "UCT" => Ok(Self::UCT),
            "Universal" => Ok(Self::Universal),
            "UTC" => Ok(Self::UTC),
            "WET" => Ok(Self::WET),
            "W-SU" => Ok(Self::WSu),
            "Zulu" => Ok(Self::Zulu),
            tz => Err(Error::WrongTimeZone(tz.to_string())),
        }
    }
}