1use time::{Date, Duration};
13
14use crate::constants::{
15 ANNUALLY, BI_WEEKLY, DAILY, MONTHLY, QUARTERLY, SEMI_ANNUALLY, SEMI_MONTHLY, SEMI_QUARTERLY,
16 TRI_ANNUALLY, WEEKLY,
17};
18
19#[derive(Debug, Clone, Copy)]
24pub enum Frequency {
25 Daily = DAILY,
27
28 Weekly = WEEKLY,
30
31 BiWeekly = BI_WEEKLY,
33
34 SemiMonthly = SEMI_MONTHLY,
36
37 Monthly = MONTHLY,
39
40 SemiQuarterly = SEMI_QUARTERLY,
42
43 Quarterly = QUARTERLY,
45
46 TriAnnually = TRI_ANNUALLY,
48
49 SemiAnnually = SEMI_ANNUALLY,
51
52 Annually = ANNUALLY,
54}
55
56impl Frequency {
57 pub fn infer_frequency(start: Date, end: Date) -> Frequency {
65 let diff = end - start;
66
67 if diff == Duration::days(1) {
68 Frequency::Daily
69 } else if diff == Duration::weeks(1) {
70 Frequency::Weekly
71 } else if diff == Duration::weeks(2) {
72 Frequency::BiWeekly
73 } else if diff > Duration::days(14) && diff < Duration::days(16) {
74 Frequency::SemiMonthly
75 } else if diff >= Duration::days(28) && diff <= Duration::days(31) {
76 Frequency::Monthly
77 } else if diff >= Duration::days(45) && diff <= Duration::days(46) {
78 Frequency::SemiQuarterly
79 } else if diff >= Duration::days(91) && diff <= Duration::days(92) {
80 Frequency::Quarterly
81 } else if diff >= Duration::days(121) && diff <= Duration::days(122) {
82 Frequency::TriAnnually
83 } else if diff >= Duration::days(182) && diff <= Duration::days(183) {
84 Frequency::SemiAnnually
85 } else if diff >= Duration::days(365) && diff <= Duration::days(366) {
86 Frequency::Annually
87 } else {
88 panic!("Unable to infer frequency between the two dates.")
89 }
90 }
91
92 pub fn times_in_year(&self) -> isize {
94 match self {
95 Frequency::Daily => DAILY,
96 Frequency::Weekly => WEEKLY,
97 Frequency::BiWeekly => BI_WEEKLY,
98 Frequency::SemiMonthly => SEMI_MONTHLY,
99 Frequency::Monthly => MONTHLY,
100 Frequency::SemiQuarterly => SEMI_QUARTERLY,
101 Frequency::Quarterly => QUARTERLY,
102 Frequency::TriAnnually => TRI_ANNUALLY,
103 Frequency::SemiAnnually => SEMI_ANNUALLY,
104 Frequency::Annually => ANNUALLY,
105 }
106 }
107}