kairos 0.4.0

A library on top of chrono to calculate times and dates ergonomically
Documentation
#[cfg(feature = "with-filters")]
use chrono::Datelike;
#[cfg(feature = "with-filters")]
use filters::filter::Filter;
#[cfg(feature = "with-filters")]
use filters::filter::IntoFilter;

#[cfg(feature = "with-filters")]
use crate::timetype::TimeType;

#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug)]
pub enum Day {
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday,
}

impl From<Day> for chrono::Weekday {
    fn from(val: Day) -> Self {
        match val {
            Day::Monday => chrono::Weekday::Mon,
            Day::Tuesday => chrono::Weekday::Tue,
            Day::Wednesday => chrono::Weekday::Wed,
            Day::Thursday => chrono::Weekday::Thu,
            Day::Friday => chrono::Weekday::Fri,
            Day::Saturday => chrono::Weekday::Sat,
            Day::Sunday => chrono::Weekday::Sun,
        }
    }
}

#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug)]
pub enum Month {
    January,
    February,
    March,
    April,
    May,
    June,
    July,
    August,
    September,
    October,
    November,
    December,
}

impl From<Month> for u32 {
    fn from(val: Month) -> Self {
        match val {
            Month::January => 1,
            Month::February => 2,
            Month::March => 3,
            Month::April => 4,
            Month::May => 5,
            Month::June => 6,
            Month::July => 7,
            Month::August => 8,
            Month::September => 9,
            Month::October => 10,
            Month::November => 11,
            Month::December => 12,
        }
    }
}

#[cfg(feature = "with-filters")]
pub struct DayFilter(Day);

#[cfg(feature = "with-filters")]
impl Filter<TimeType> for DayFilter {
    fn filter(&self, tt: &TimeType) -> bool {
        tt.get_moment()
            .map(|mom| mom.weekday() == self.0.clone().into())
            .unwrap_or(false)
    }
}

#[cfg(feature = "with-filters")]
impl IntoFilter<TimeType> for Day {
    type IntoFilt = DayFilter;

    fn into_filter(self) -> Self::IntoFilt {
        DayFilter(self)
    }
}

#[cfg(feature = "with-filters")]
pub struct MonthFilter(Month);

#[cfg(feature = "with-filters")]
impl Filter<TimeType> for MonthFilter {
    fn filter(&self, tt: &TimeType) -> bool {
        tt.get_moment()
            .map(|mom| mom.month() == self.0.clone().into())
            .unwrap_or(false)
    }
}

#[cfg(feature = "with-filters")]
impl IntoFilter<TimeType> for Month {
    type IntoFilt = MonthFilter;

    fn into_filter(self) -> Self::IntoFilt {
        MonthFilter(self)
    }
}