add conversion from Gregorian
This commit is contained in:
parent
f5a7894662
commit
97efdc9ae6
158
ifc/src/lib.rs
158
ifc/src/lib.rs
|
@ -1,5 +1,6 @@
|
||||||
use chrono::{Datelike, NaiveDate};
|
use chrono::{Datelike, NaiveDate};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::convert::TryInto;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Error, PartialEq)]
|
#[derive(Clone, Debug, Error, PartialEq)]
|
||||||
|
@ -194,9 +195,27 @@ pub struct Day {
|
||||||
day: u8,
|
day: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<chrono::NaiveDate> for Day {
|
impl From<chrono::NaiveDate> for IFC {
|
||||||
fn from(date: chrono::NaiveDate) -> Self {
|
fn from(date: chrono::NaiveDate) -> Self {
|
||||||
unimplemented!();
|
if date.month() == 12 && date.day() == 31 {
|
||||||
|
Self::YearDay(date.year())
|
||||||
|
} else if is_leap_year(date.year()) && date.month() == 6 && date.day() == 17 {
|
||||||
|
Self::LeapDay(date.year())
|
||||||
|
} else {
|
||||||
|
let mut days = date.ordinal();
|
||||||
|
if is_leap_year(date.year())
|
||||||
|
&& date > NaiveDate::from_ymd_opt(date.year(), 6, 17).unwrap()
|
||||||
|
{
|
||||||
|
days = days - 1;
|
||||||
|
}
|
||||||
|
let month: u8 = (days / 28).try_into().unwrap();
|
||||||
|
let day: u8 = (days % 28).try_into().unwrap();
|
||||||
|
Self::Day(Day {
|
||||||
|
year: date.year(),
|
||||||
|
month: month + 1,
|
||||||
|
day,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -574,6 +593,141 @@ mod tests {
|
||||||
assert_eq!(IFC::ymd(12022, 13, 28).unwrap().week_ordinal0(), 51);
|
assert_eq!(IFC::ymd(12022, 13, 28).unwrap().week_ordinal0(), 51);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn it_converts_from_gregorian() {
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 1, 1).unwrap()),
|
||||||
|
IFC::ymd(12022, 1, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 1, 29).unwrap()),
|
||||||
|
IFC::ymd(12022, 2, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 2, 26).unwrap()),
|
||||||
|
IFC::ymd(12022, 3, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 3, 26).unwrap()),
|
||||||
|
IFC::ymd(12022, 4, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 4, 23).unwrap()),
|
||||||
|
IFC::ymd(12022, 5, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 5, 21).unwrap()),
|
||||||
|
IFC::ymd(12022, 6, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 6, 18).unwrap()),
|
||||||
|
IFC::ymd(12022, 7, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 7, 16).unwrap()),
|
||||||
|
IFC::ymd(12022, 8, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 8, 13).unwrap()),
|
||||||
|
IFC::ymd(12022, 9, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 9, 10).unwrap()),
|
||||||
|
IFC::ymd(12022, 10, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 10, 8).unwrap()),
|
||||||
|
IFC::ymd(12022, 11, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 11, 5).unwrap()),
|
||||||
|
IFC::ymd(12022, 12, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 12, 3).unwrap()),
|
||||||
|
IFC::ymd(12022, 13, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12022, 12, 31).unwrap()),
|
||||||
|
IFC::YearDay(12022)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn it_converts_from_gregorian_on_leap_year() {
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 1, 1).unwrap()),
|
||||||
|
IFC::ymd(12020, 1, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 1, 29).unwrap()),
|
||||||
|
IFC::ymd(12020, 2, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 2, 26).unwrap()),
|
||||||
|
IFC::ymd(12020, 3, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 2, 28).unwrap()),
|
||||||
|
IFC::ymd(12020, 3, 3).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 2, 29).unwrap()),
|
||||||
|
IFC::ymd(12020, 3, 4).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 3, 1).unwrap()),
|
||||||
|
IFC::ymd(12020, 3, 5).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 3, 25).unwrap()),
|
||||||
|
IFC::ymd(12020, 4, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 4, 22).unwrap()),
|
||||||
|
IFC::ymd(12020, 5, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 5, 20).unwrap()),
|
||||||
|
IFC::ymd(12020, 6, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 6, 17).unwrap()),
|
||||||
|
IFC::LeapDay(12020)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 6, 18).unwrap()),
|
||||||
|
IFC::ymd(12020, 7, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 7, 16).unwrap()),
|
||||||
|
IFC::ymd(12020, 8, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 8, 13).unwrap()),
|
||||||
|
IFC::ymd(12020, 9, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 9, 10).unwrap()),
|
||||||
|
IFC::ymd(12020, 10, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 10, 8).unwrap()),
|
||||||
|
IFC::ymd(12020, 11, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 11, 5).unwrap()),
|
||||||
|
IFC::ymd(12020, 12, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 12, 3).unwrap()),
|
||||||
|
IFC::ymd(12020, 13, 1).unwrap()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
IFC::from(NaiveDate::from_ymd_opt(12020, 12, 31).unwrap()),
|
||||||
|
IFC::YearDay(12020)
|
||||||
|
);
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
#[test]
|
#[test]
|
||||||
fn check_start_of_month() {
|
fn check_start_of_month() {
|
||||||
|
|
Loading…
Reference in New Issue