pub mod types {
pub use time::Month as TimeMonth;
pub use time::{Date as Date, Duration as Duration, Weekday as Weekday};
pub use time::macros::date;
pub type Year = u16;
pub type Day = u8;
pub const MIN_DATE: Date = date!(0001 - 01 - 01);
pub const MAX_DATE: Date = date!(9999 - 12 - 31);
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(u8)]
pub enum Month {
January,
February,
March,
April,
May,
June,
July,
August,
September,
October,
November,
December,
}
impl Month {
pub fn to_index(&self) -> u8 {
*self as u8 + 1
}
pub fn from_index(index: u8) -> Option<Self> {
match index {
1 => Some(Month::January),
2 => Some(Month::February),
3 => Some(Month::March),
4 => Some(Month::April),
5 => Some(Month::May),
6 => Some(Month::June),
7 => Some(Month::July),
8 => Some(Month::August),
9 => Some(Month::September),
10 => Some(Month::October),
11 => Some(Month::November),
12 => Some(Month::December),
_ => None,
}
}
pub fn to_time_month(&self) -> TimeMonth {
TimeMonth::try_from(self.to_index()).expect("Invalid month index")
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum BiDay {
Zero,
One,
}
impl BiDay {
pub fn to_u8(&self) -> u8 {
match self {
BiDay::Zero => 0,
BiDay::One => 1,
}
}
pub fn from_u8(value: u8) -> Option<BiDay> {
match value {
0 => Some(BiDay::Zero),
1 => Some(BiDay::One),
_ => None,
}
}
}
#[cfg(test)]
mod tests_types {
use super::*;
#[test]
fn month_to_index_test() {
assert_eq!(Month::January.to_index(), 1);
assert_eq!(Month::December.to_index(), 12);
}
#[test]
fn month_from_index_test() {
assert_eq!(Month::from_index(1), Some(Month::January));
assert_eq!(Month::from_index(12), Some(Month::December));
assert_eq!(Month::from_index(13), None);
}
#[test]
fn month_from_index_outbound_no_panic_test() {
assert_eq!(Month::from_index(13), None);
}
#[test]
fn biday_to_u8_test() {
assert_eq!(BiDay::Zero.to_u8(), 0);
assert_eq!(BiDay::One.to_u8(), 1);
}
#[test]
fn biday_from_u8_test() {
assert_eq!(BiDay::from_u8(0), Some(BiDay::Zero));
assert_eq!(BiDay::from_u8(1), Some(BiDay::One));
assert_eq!(BiDay::from_u8(2), None);
}
}
}