use time::{Date, Duration};
use crate::constants::{
ANNUALLY, BI_WEEKLY, DAILY, MONTHLY, QUARTERLY, SEMI_ANNUALLY, SEMI_MONTHLY, SEMI_QUARTERLY,
TRI_ANNUALLY, WEEKLY,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Frequency {
Daily = DAILY,
Weekly = WEEKLY,
BiWeekly = BI_WEEKLY,
SemiMonthly = SEMI_MONTHLY,
Monthly = MONTHLY,
SemiQuarterly = SEMI_QUARTERLY,
Quarterly = QUARTERLY,
TriAnnually = TRI_ANNUALLY,
SemiAnnually = SEMI_ANNUALLY,
Annually = ANNUALLY,
Zero = 0,
}
impl Frequency {
pub fn infer_frequency(start: Date, end: Date) -> Frequency {
let diff = end - start;
if diff == Duration::days(1) {
Frequency::Daily
} else if diff == Duration::weeks(1) {
Frequency::Weekly
} else if diff == Duration::weeks(2) {
Frequency::BiWeekly
} else if diff > Duration::days(14) && diff < Duration::days(16) {
Frequency::SemiMonthly
} else if diff >= Duration::days(28) && diff <= Duration::days(31) {
Frequency::Monthly
} else if diff >= Duration::days(45) && diff <= Duration::days(46) {
Frequency::SemiQuarterly
} else if diff >= Duration::days(91) && diff <= Duration::days(92) {
Frequency::Quarterly
} else if diff >= Duration::days(121) && diff <= Duration::days(122) {
Frequency::TriAnnually
} else if diff >= Duration::days(182) && diff <= Duration::days(183) {
Frequency::SemiAnnually
} else if diff >= Duration::days(365) && diff <= Duration::days(366) {
Frequency::Annually
} else {
panic!("Unable to infer frequency between the two dates.")
}
}
pub fn times_in_year(&self) -> isize {
match self {
Frequency::Daily => DAILY,
Frequency::Weekly => WEEKLY,
Frequency::BiWeekly => BI_WEEKLY,
Frequency::SemiMonthly => SEMI_MONTHLY,
Frequency::Monthly => MONTHLY,
Frequency::SemiQuarterly => SEMI_QUARTERLY,
Frequency::Quarterly => QUARTERLY,
Frequency::TriAnnually => TRI_ANNUALLY,
Frequency::SemiAnnually => SEMI_ANNUALLY,
Frequency::Annually => ANNUALLY,
Frequency::Zero => 0,
}
}
}