@@ -7,6 +7,8 @@ use winnow::error::{ContextError, StrContext, StrContextValue};
77use winnow:: token:: take;
88use winnow:: Parser ;
99
10+ use crate :: error:: DxrError ;
11+
1012#[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
1113pub struct DateTime {
1214 year : u16 ,
@@ -55,31 +57,15 @@ impl Display for DateTime {
5557}
5658
5759impl FromStr for DateTime {
58- type Err = DateTimeParseError ;
60+ type Err = DxrError ;
5961
6062 fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
6163 DateTimeParser
6264 . parse ( s)
63- . map_err ( |e| DateTimeParseError :: InvalidFormat ( e. to_string ( ) ) )
65+ . map_err ( |e| DxrError :: invalid_datetime ( e. to_string ( ) ) )
6466 }
6567}
6668
67- #[ derive( Clone , Debug , thiserror:: Error ) ]
68- pub enum DateTimeParseError {
69- #[ error( "Invalid format for dateTime.iso8601 value: {}" , . 0 ) ]
70- InvalidFormat ( String ) ,
71- #[ error( "Invalid dateTime.iso8601 value: Month out of range ({})" , . 0 ) ]
72- InvalidMonth ( u8 ) ,
73- #[ error( "Invalid dateTime.iso8601 value: Day out of range ({})" , . 0 ) ]
74- InvalidDay ( u8 ) ,
75- #[ error( "Invalid dateTime.iso8601 value: Hour out of range ({})" , . 0 ) ]
76- InvalidHour ( u8 ) ,
77- #[ error( "Invalid dateTime.iso8601 value: Minutes out of range ({})" , . 0 ) ]
78- InvalidMinutes ( u8 ) ,
79- #[ error( "Invalid dateTime.iso8601 value: Seconds out of range ({})" , . 0 ) ]
80- InvalidSeconds ( u8 ) ,
81- }
82-
8369struct DateTimeParser ;
8470
8571impl Parser < & str , DateTime , ContextError > for DateTimeParser {
@@ -127,10 +113,7 @@ impl Parser<&str, u8, ContextError> for MonthParser {
127113 fn parse_next ( & mut self , input : & mut & str ) -> winnow:: Result < u8 > {
128114 take ( 2usize )
129115 . parse_to ( )
130- . try_map ( |month| match month {
131- 1 ..=12 => Ok ( month) ,
132- _ => Err ( DateTimeParseError :: InvalidMonth ( month) ) ,
133- } )
116+ . verify ( |m| * m > 0 && * m <= 12 )
134117 . context ( StrContext :: Label ( "month" ) )
135118 . parse_next ( input)
136119 }
@@ -144,13 +127,7 @@ impl Parser<&str, u8, ContextError> for DayParser {
144127 fn parse_next ( & mut self , input : & mut & str ) -> winnow:: Result < u8 > {
145128 take ( 2usize )
146129 . parse_to ( )
147- . try_map ( |day| {
148- if day == 0 || day > self . max {
149- Err ( DateTimeParseError :: InvalidDay ( day) )
150- } else {
151- Ok ( day)
152- }
153- } )
130+ . verify ( |d| * d > 0 && * d <= self . max )
154131 . context ( StrContext :: Label ( "day" ) )
155132 . parse_next ( input)
156133 }
@@ -162,13 +139,7 @@ impl Parser<&str, u8, ContextError> for HourParser {
162139 fn parse_next ( & mut self , input : & mut & str ) -> winnow:: Result < u8 > {
163140 take ( 2usize )
164141 . parse_to ( )
165- . try_map ( |hour| {
166- if hour > 24 {
167- Err ( DateTimeParseError :: InvalidHour ( hour) )
168- } else {
169- Ok ( hour)
170- }
171- } )
142+ . verify ( |h| * h < 24 )
172143 . context ( StrContext :: Label ( "hour" ) )
173144 . parse_next ( input)
174145 }
@@ -180,13 +151,7 @@ impl Parser<&str, u8, ContextError> for MinuteParser {
180151 fn parse_next ( & mut self , input : & mut & str ) -> winnow:: Result < u8 > {
181152 take ( 2usize )
182153 . parse_to ( )
183- . try_map ( |minute| {
184- if minute > 59 {
185- Err ( DateTimeParseError :: InvalidMinutes ( minute) )
186- } else {
187- Ok ( minute)
188- }
189- } )
154+ . verify ( |m| * m < 60 )
190155 . context ( StrContext :: Label ( "minute" ) )
191156 . parse_next ( input)
192157 }
@@ -198,13 +163,7 @@ impl Parser<&str, u8, ContextError> for SecondParser {
198163 fn parse_next ( & mut self , input : & mut & str ) -> winnow:: Result < u8 > {
199164 take ( 2usize )
200165 . parse_to ( )
201- . try_map ( |second| {
202- if second > 59 {
203- Err ( DateTimeParseError :: InvalidSeconds ( second) )
204- } else {
205- Ok ( second)
206- }
207- } )
166+ . verify ( |s| * s < 60 )
208167 . context ( StrContext :: Label ( "second" ) )
209168 . parse_next ( input)
210169 }
0 commit comments