timer_util/
data.rs

1use crate::traits::{AsBizData, FromData};
2use crate::TryFromData;
3use anyhow::{bail, Result};
4use chrono::{Datelike, Local, NaiveDate, NaiveDateTime, NaiveTime, Timelike, Weekday as CWeekday};
5
6// use time::{OffsetDateTime, Weekday};
7#[derive(Copy, Clone, Debug, Eq, PartialEq)]
8pub(crate) struct DateTime {
9    pub(crate) date: NaiveDate,
10    pub(crate) month_day: MonthDay,
11    pub(crate) week_day: WeekDay,
12    pub(crate) hour: Hour,
13    pub(crate) minuter: Minuter,
14    pub(crate) second: Second,
15}
16
17#[derive(Copy, Clone, Debug, Eq, PartialEq)]
18#[repr(u64)]
19pub enum WeekDay {
20    W1 = 1,
21    W2,
22    W3,
23    W4,
24    W5,
25    W6,
26    W7,
27}
28
29#[derive(Copy, Clone, Debug, Eq, PartialEq)]
30#[repr(u64)]
31pub enum MonthDay {
32    D1 = 1,
33    D2,
34    D3,
35    D4,
36    D5,
37    D6,
38    D7,
39    D8,
40    D9,
41    D10,
42    D11,
43    D12,
44    D13,
45    D14,
46    D15,
47    D16,
48    D17,
49    D18,
50    D19,
51    D20,
52    D21,
53    D22,
54    D23,
55    D24,
56    D25,
57    D26,
58    D27,
59    D28,
60    D29,
61    D30,
62    D31,
63}
64
65#[derive(Copy, Clone, Debug, Eq, PartialEq)]
66#[repr(u64)]
67pub enum Hour {
68    H0 = 0,
69    H1,
70    H2,
71    H3,
72    H4,
73    H5,
74    H6,
75    H7,
76    H8,
77    H9,
78    H10,
79    H11,
80    H12,
81    H13,
82    H14,
83    H15,
84    H16,
85    H17,
86    H18,
87    H19,
88    H20,
89    H21,
90    H22,
91    H23,
92}
93
94#[derive(Copy, Clone, Debug, Eq, PartialEq)]
95#[repr(u64)]
96pub enum Minuter {
97    M0 = 0,
98    M1,
99    M2,
100    M3,
101    M4,
102    M5,
103    M6,
104    M7,
105    M8,
106    M9,
107    M10,
108    M11,
109    M12,
110    M13,
111    M14,
112    M15,
113    M16,
114    M17,
115    M18,
116    M19,
117    M20,
118    M21,
119    M22,
120    M23,
121    M24,
122    M25,
123    M26,
124    M27,
125    M28,
126    M29,
127    M30,
128    M31,
129    M32,
130    M33,
131    M34,
132    M35,
133    M36,
134    M37,
135    M38,
136    M39,
137    M40,
138    M41,
139    M42,
140    M43,
141    M44,
142    M45,
143    M46,
144    M47,
145    M48,
146    M49,
147    M50,
148    M51,
149    M52,
150    M53,
151    M54,
152    M55,
153    M56,
154    M57,
155    M58,
156    M59,
157}
158
159#[derive(Copy, Clone, Debug, Eq, PartialEq)]
160#[repr(u64)]
161pub enum Second {
162    S0 = 0,
163    S1,
164    S2,
165    S3,
166    S4,
167    S5,
168    S6,
169    S7,
170    S8,
171    S9,
172    S10,
173    S11,
174    S12,
175    S13,
176    S14,
177    S15,
178    S16,
179    S17,
180    S18,
181    S19,
182    S20,
183    S21,
184    S22,
185    S23,
186    S24,
187    S25,
188    S26,
189    S27,
190    S28,
191    S29,
192    S30,
193    S31,
194    S32,
195    S33,
196    S34,
197    S35,
198    S36,
199    S37,
200    S38,
201    S39,
202    S40,
203    S41,
204    S42,
205    S43,
206    S44,
207    S45,
208    S46,
209    S47,
210    S48,
211    S49,
212    S50,
213    S51,
214    S52,
215    S53,
216    S54,
217    S55,
218    S56,
219    S57,
220    S58,
221    S59,
222}
223
224impl DateTime {
225    #[allow(dead_code)]
226    pub(crate) fn default() -> Result<Self> {
227        let now = Local::now().naive_local();
228        Ok(now.into())
229    }
230}
231
232impl From<NaiveDateTime> for DateTime {
233    fn from(tmp: NaiveDateTime) -> Self {
234        let date = tmp.date();
235        let time = tmp.time();
236
237        let month_day = MonthDay::from_data(date.day() as u64);
238        let week_day: WeekDay = date.weekday().into();
239        let hour = Hour::from_data(time.hour() as u64);
240        let minuter = Minuter::from_data(time.minute() as u64);
241        let second = Second::from_data(time.second() as u64);
242        Self {
243            date,
244            month_day,
245            week_day,
246            hour,
247            minuter,
248            second,
249        }
250    }
251}
252impl From<DateTime> for NaiveDateTime {
253    fn from(tmp: DateTime) -> Self {
254        NaiveDateTime::new(
255            tmp.date,
256            NaiveTime::from_hms(
257                tmp.hour.as_data() as u32,
258                tmp.minuter.as_data() as u32,
259                tmp.second.as_data() as u32,
260            ),
261        )
262    }
263}
264
265impl AsBizData<u64> for WeekDay {
266    fn as_data(self) -> u64 {
267        self as u64
268    }
269}
270impl AsBizData<u64> for MonthDay {
271    fn as_data(self) -> u64 {
272        self as u64
273    }
274}
275impl AsBizData<u64> for Hour {
276    fn as_data(self) -> u64 {
277        self as u64
278    }
279}
280impl AsBizData<u64> for Minuter {
281    fn as_data(self) -> u64 {
282        self as u64
283    }
284}
285impl AsBizData<u64> for Second {
286    fn as_data(self) -> u64 {
287        self as u64
288    }
289}
290
291impl<T, A: AsBizData<T>> AsBizData<T> for &A {
292    fn as_data(self) -> T {
293        (*self).as_data()
294    }
295}
296
297impl From<CWeekday> for WeekDay {
298    fn from(day: CWeekday) -> Self {
299        match day {
300            CWeekday::Mon => Self::W1,
301            CWeekday::Tue => Self::W2,
302            CWeekday::Wed => Self::W3,
303            CWeekday::Thu => Self::W4,
304            CWeekday::Fri => Self::W5,
305            CWeekday::Sat => Self::W6,
306            CWeekday::Sun => Self::W7,
307        }
308    }
309}
310
311impl FromData<u64> for MonthDay {
312    fn from_data(val: u64) -> Self {
313        assert!(val < 32 && val != 0);
314        match val {
315            1 => Self::D1,
316            2 => Self::D2,
317            3 => Self::D3,
318            4 => Self::D4,
319            5 => Self::D5,
320            6 => Self::D6,
321            7 => Self::D7,
322            8 => Self::D8,
323            9 => Self::D9,
324            10 => Self::D10,
325            11 => Self::D11,
326            12 => Self::D12,
327            13 => Self::D13,
328            14 => Self::D14,
329            15 => Self::D15,
330            16 => Self::D16,
331            17 => Self::D17,
332            18 => Self::D18,
333            19 => Self::D19,
334            20 => Self::D20,
335            21 => Self::D21,
336            22 => Self::D22,
337            23 => Self::D23,
338            24 => Self::D24,
339            25 => Self::D25,
340            26 => Self::D26,
341            27 => Self::D27,
342            28 => Self::D28,
343            29 => Self::D29,
344            30 => Self::D30,
345            31 => Self::D31,
346            _ => unreachable!("bug!"),
347        }
348    }
349}
350impl FromData<u64> for WeekDay {
351    fn from_data(val: u64) -> Self {
352        assert!(val < 8 && val != 0);
353        match val {
354            1 => Self::W1,
355            2 => Self::W2,
356            3 => Self::W3,
357            4 => Self::W4,
358            5 => Self::W5,
359            6 => Self::W6,
360            7 => Self::W7,
361            _ => unreachable!("bug!"),
362        }
363    }
364}
365
366impl FromData<u64> for Hour {
367    fn from_data(val: u64) -> Self {
368        assert!(val < 24);
369        match val {
370            0 => Self::H0,
371            1 => Self::H1,
372            2 => Self::H2,
373            3 => Self::H3,
374            4 => Self::H4,
375            5 => Self::H5,
376            6 => Self::H6,
377            7 => Self::H7,
378            8 => Self::H8,
379            9 => Self::H9,
380            10 => Self::H10,
381            11 => Self::H11,
382            12 => Self::H12,
383            13 => Self::H13,
384            14 => Self::H14,
385            15 => Self::H15,
386            16 => Self::H16,
387            17 => Self::H17,
388            18 => Self::H18,
389            19 => Self::H19,
390            20 => Self::H20,
391            21 => Self::H21,
392            22 => Self::H22,
393            23 => Self::H23,
394            _ => unreachable!("bug!"),
395        }
396    }
397}
398
399impl FromData<u64> for Minuter {
400    fn from_data(val: u64) -> Self {
401        assert!(val < 60);
402        match val {
403            0 => Self::M0,
404            1 => Self::M1,
405            2 => Self::M2,
406            3 => Self::M3,
407            4 => Self::M4,
408            5 => Self::M5,
409            6 => Self::M6,
410            7 => Self::M7,
411            8 => Self::M8,
412            9 => Self::M9,
413            10 => Self::M10,
414            11 => Self::M11,
415            12 => Self::M12,
416            13 => Self::M13,
417            14 => Self::M14,
418            15 => Self::M15,
419            16 => Self::M16,
420            17 => Self::M17,
421            18 => Self::M18,
422            19 => Self::M19,
423            20 => Self::M20,
424            21 => Self::M21,
425            22 => Self::M22,
426            23 => Self::M23,
427            24 => Self::M24,
428            25 => Self::M25,
429            26 => Self::M26,
430            27 => Self::M27,
431            28 => Self::M28,
432            29 => Self::M29,
433            30 => Self::M30,
434            31 => Self::M31,
435            32 => Self::M32,
436            33 => Self::M33,
437            34 => Self::M34,
438            35 => Self::M35,
439            36 => Self::M36,
440            37 => Self::M37,
441            38 => Self::M38,
442            39 => Self::M39,
443            40 => Self::M40,
444            41 => Self::M41,
445            42 => Self::M42,
446            43 => Self::M43,
447            44 => Self::M44,
448            45 => Self::M45,
449            46 => Self::M46,
450            47 => Self::M47,
451            48 => Self::M48,
452            49 => Self::M49,
453            50 => Self::M50,
454            51 => Self::M51,
455            52 => Self::M52,
456            53 => Self::M53,
457            54 => Self::M54,
458            55 => Self::M55,
459            56 => Self::M56,
460            57 => Self::M57,
461            58 => Self::M58,
462            59 => Self::M59,
463            _ => unreachable!("bug!"),
464        }
465    }
466}
467
468impl FromData<u64> for Second {
469    fn from_data(val: u64) -> Self {
470        assert!(val < 60);
471        match val {
472            0 => Self::S0,
473            1 => Self::S1,
474            2 => Self::S2,
475            3 => Self::S3,
476            4 => Self::S4,
477            5 => Self::S5,
478            6 => Self::S6,
479            7 => Self::S7,
480            8 => Self::S8,
481            9 => Self::S9,
482            10 => Self::S10,
483            11 => Self::S11,
484            12 => Self::S12,
485            13 => Self::S13,
486            14 => Self::S14,
487            15 => Self::S15,
488            16 => Self::S16,
489            17 => Self::S17,
490            18 => Self::S18,
491            19 => Self::S19,
492            20 => Self::S20,
493            21 => Self::S21,
494            22 => Self::S22,
495            23 => Self::S23,
496            24 => Self::S24,
497            25 => Self::S25,
498            26 => Self::S26,
499            27 => Self::S27,
500            28 => Self::S28,
501            29 => Self::S29,
502            30 => Self::S30,
503            31 => Self::S31,
504            32 => Self::S32,
505            33 => Self::S33,
506            34 => Self::S34,
507            35 => Self::S35,
508            36 => Self::S36,
509            37 => Self::S37,
510            38 => Self::S38,
511            39 => Self::S39,
512            40 => Self::S40,
513            41 => Self::S41,
514            42 => Self::S42,
515            43 => Self::S43,
516            44 => Self::S44,
517            45 => Self::S45,
518            46 => Self::S46,
519            47 => Self::S47,
520            48 => Self::S48,
521            49 => Self::S49,
522            50 => Self::S50,
523            51 => Self::S51,
524            52 => Self::S52,
525            53 => Self::S53,
526            54 => Self::S54,
527            55 => Self::S55,
528            56 => Self::S56,
529            57 => Self::S57,
530            58 => Self::S58,
531            59 => Self::S59,
532            _ => unreachable!("bug!"),
533        }
534    }
535}
536
537impl TryFromData<u64> for MonthDay {
538    fn try_from_data(val: u64) -> Result<Self> {
539        if val == 0 || val > 31 {
540            bail!("month day should not be 0 or > 31");
541        }
542        Ok(MonthDay::from_data(val))
543    }
544}
545impl TryFromData<u64> for WeekDay {
546    fn try_from_data(val: u64) -> Result<Self> {
547        if val >= 8 || val == 0 {
548            bail!("week day should not be 0 or >= 60");
549        }
550        Ok(WeekDay::from_data(val))
551    }
552}
553impl TryFromData<u64> for Hour {
554    fn try_from_data(val: u64) -> Result<Self> {
555        if val >= 24 {
556            bail!("week day should not >= 24");
557        }
558        Ok(Hour::from_data(val))
559    }
560}
561impl TryFromData<u64> for Minuter {
562    fn try_from_data(val: u64) -> Result<Self> {
563        if val >= 60 {
564            bail!("minuter should not >= 60");
565        }
566        Ok(Minuter::from_data(val))
567    }
568}
569impl TryFromData<u64> for Second {
570    fn try_from_data(val: u64) -> Result<Self> {
571        if val >= 60 {
572            bail!("second should not >= 60");
573        }
574        Ok(Second::from_data(val))
575    }
576}