1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use {
    Valid,
    date::*,
    time::*
};

#[derive(Eq, PartialEq, Clone, Debug)]
pub struct DateTime<D = YmdDate, T = GlobalTime>
where D: Datelike, T: Timelike {
    pub date: D,
    pub time: T
}

impl_fromstr_parse!(DateTime<Date,       GlobalTime<HmsTime>>, datetime_global_hms);
impl_fromstr_parse!(DateTime<Date,       GlobalTime<HmTime>>,  datetime_global_hm);
impl_fromstr_parse!(DateTime<Date,       GlobalTime<HTime>>,   datetime_global_h);
impl_fromstr_parse!(DateTime<Date,       LocalTime<HmsTime>>,  datetime_local_hms);
impl_fromstr_parse!(DateTime<Date,       LocalTime<HmTime>>,   datetime_local_hm);
impl_fromstr_parse!(DateTime<Date,       LocalTime<HTime>>,    datetime_local_h);
impl_fromstr_parse!(DateTime<Date,       AnyTime<HmsTime>>,    datetime_any_hms);
impl_fromstr_parse!(DateTime<Date,       AnyTime<HmTime>>,     datetime_any_hm);
impl_fromstr_parse!(DateTime<Date,       AnyTime<HTime>>,      datetime_any_h);
impl_fromstr_parse!(DateTime<Date,       ApproxGlobalTime>,    datetime_global_approx);
impl_fromstr_parse!(DateTime<Date,       ApproxLocalTime>,     datetime_local_approx);
impl_fromstr_parse!(DateTime<Date,       ApproxAnyTime>,       datetime_any_approx);
impl_fromstr_parse!(DateTime<ApproxDate, GlobalTime<HmsTime>>, datetime_approx_global_hms);
impl_fromstr_parse!(DateTime<ApproxDate, GlobalTime<HmTime>>,  datetime_approx_global_hm);
impl_fromstr_parse!(DateTime<ApproxDate, GlobalTime<HTime>>,   datetime_approx_global_h);
impl_fromstr_parse!(DateTime<ApproxDate, LocalTime<HmsTime>>,  datetime_approx_local_hms);
impl_fromstr_parse!(DateTime<ApproxDate, LocalTime<HmTime>>,   datetime_approx_local_hm);
impl_fromstr_parse!(DateTime<ApproxDate, LocalTime<HTime>>,    datetime_approx_local_h);
impl_fromstr_parse!(DateTime<ApproxDate, AnyTime<HmsTime>>,    datetime_approx_any_hms);
impl_fromstr_parse!(DateTime<ApproxDate, AnyTime<HmTime>>,     datetime_approx_any_hm);
impl_fromstr_parse!(DateTime<ApproxDate, AnyTime<HTime>>,      datetime_approx_any_h);
impl_fromstr_parse!(DateTime<ApproxDate, ApproxGlobalTime>,    datetime_approx_global_approx);
impl_fromstr_parse!(DateTime<ApproxDate, ApproxLocalTime>,     datetime_approx_local_approx);
impl_fromstr_parse!(DateTime<ApproxDate, ApproxAnyTime>,       datetime_approx_any_approx);

impl<D, T> Valid for DateTime<D, T>
where
    D: Datelike + Valid,
    T: Timelike + Valid
{
    fn is_valid(&self) -> bool {
        self.date.is_valid() &&
        self.time.is_valid()
    }
}