1
1
use crate :: time:: format:: { DEFAULT , ISO8601 , ISO8601_STRICT , RFC2822 , SHORT } ;
2
2
use crate :: time:: Sign ;
3
3
use crate :: Time ;
4
- use std:: num:: ParseIntError ;
4
+ use std:: convert:: TryInto ;
5
+ use std:: num:: TryFromIntError ;
5
6
use std:: str:: FromStr ;
6
7
use time:: { Date , OffsetDateTime } ;
7
8
@@ -10,13 +11,10 @@ use time::{Date, OffsetDateTime};
10
11
pub enum Error {
11
12
#[ error( "Date string can not be parsed" ) ]
12
13
InvalidDateString ,
13
-
14
- #[ error( "Timezone offset can not be parsed" ) ]
15
- InvalidTzOffset ,
16
14
#[ error( "Relative period can not be parsed" ) ]
17
15
InvalidPeriod ,
18
- #[ error( "Integer string can not be parsed " ) ]
19
- InvalidInteger ( #[ from] ParseIntError ) ,
16
+ #[ error( "Dates past 2038 can not be represented. " ) ]
17
+ InvalidDate ( #[ from] TryFromIntError ) ,
20
18
}
21
19
22
20
#[ allow( missing_docs) ]
@@ -27,15 +25,30 @@ pub fn parse(input: &str) -> Result<Time, Error> {
27
25
} else {
28
26
return if let Ok ( val) = Date :: parse ( input, SHORT ) {
29
27
let val = val. with_hms ( 0 , 0 , 0 ) . expect ( "date is in range" ) . assume_utc ( ) ;
30
- Ok ( Time :: new ( val. unix_timestamp ( ) as u32 , val. offset ( ) . whole_seconds ( ) ) )
28
+ Ok ( Time :: new (
29
+ val. unix_timestamp ( ) . try_into ( ) ?,
30
+ val. offset ( ) . whole_seconds ( ) ,
31
+ ) )
31
32
} else if let Ok ( val) = OffsetDateTime :: parse ( input, RFC2822 ) {
32
- Ok ( Time :: new ( val. unix_timestamp ( ) as u32 , val. offset ( ) . whole_seconds ( ) ) )
33
+ Ok ( Time :: new (
34
+ val. unix_timestamp ( ) . try_into ( ) ?,
35
+ val. offset ( ) . whole_seconds ( ) ,
36
+ ) )
33
37
} else if let Ok ( val) = OffsetDateTime :: parse ( input, ISO8601 ) {
34
- Ok ( Time :: new ( val. unix_timestamp ( ) as u32 , val. offset ( ) . whole_seconds ( ) ) )
38
+ Ok ( Time :: new (
39
+ val. unix_timestamp ( ) . try_into ( ) ?,
40
+ val. offset ( ) . whole_seconds ( ) ,
41
+ ) )
35
42
} else if let Ok ( val) = OffsetDateTime :: parse ( input, ISO8601_STRICT ) {
36
- Ok ( Time :: new ( val. unix_timestamp ( ) as u32 , val. offset ( ) . whole_seconds ( ) ) )
43
+ Ok ( Time :: new (
44
+ val. unix_timestamp ( ) . try_into ( ) ?,
45
+ val. offset ( ) . whole_seconds ( ) ,
46
+ ) )
37
47
} else if let Ok ( val) = OffsetDateTime :: parse ( input, DEFAULT ) {
38
- Ok ( Time :: new ( val. unix_timestamp ( ) as u32 , val. offset ( ) . whole_seconds ( ) ) )
48
+ Ok ( Time :: new (
49
+ val. unix_timestamp ( ) . try_into ( ) ?,
50
+ val. offset ( ) . whole_seconds ( ) ,
51
+ ) )
39
52
} else if let Ok ( val) = u32:: from_str ( input) {
40
53
// Format::Unix
41
54
Ok ( Time :: new ( val, 0 ) )
0 commit comments