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#[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}