@@ -143,7 +143,7 @@ impl Display for Offset {
143
143
}
144
144
145
145
#[ derive( Clone ) ]
146
- enum Suffix {
146
+ enum Meridiem {
147
147
Am ,
148
148
Pm ,
149
149
}
@@ -178,30 +178,37 @@ pub fn iso(input: &mut &str) -> ModalResult<Time> {
178
178
///
179
179
/// The hours are restricted to 12 or lower in this format
180
180
fn am_pm_time ( input : & mut & str ) -> ModalResult < Time > {
181
- seq ! (
181
+ let ( h , m , s , meridiem ) = seq ! (
182
182
hour12,
183
183
opt( preceded( colon, minute) ) ,
184
184
opt( preceded( colon, second) ) ,
185
185
alt( (
186
- s( "am" ) . value( Suffix :: Am ) ,
187
- s( "a.m." ) . value( Suffix :: Am ) ,
188
- s( "pm" ) . value( Suffix :: Pm ) ,
189
- s( "p.m." ) . value( Suffix :: Pm )
186
+ s( "am" ) . value( Meridiem :: Am ) ,
187
+ s( "a.m." ) . value( Meridiem :: Am ) ,
188
+ s( "pm" ) . value( Meridiem :: Pm ) ,
189
+ s( "p.m." ) . value( Meridiem :: Pm )
190
190
) ) ,
191
191
)
192
- . map ( |( h, m, s, suffix) | {
193
- let mut h = h % 12 ;
194
- if let Suffix :: Pm = suffix {
195
- h += 12 ;
196
- }
197
- Time {
198
- hour : h,
199
- minute : m. unwrap_or ( 0 ) ,
200
- second : s. unwrap_or ( 0.0 ) ,
201
- offset : None ,
202
- }
192
+ . parse_next ( input) ?;
193
+
194
+ if h == 0 {
195
+ let mut ctx_err = ContextError :: new ( ) ;
196
+ ctx_err. push ( StrContext :: Expected ( StrContextValue :: Description (
197
+ "hour must be greater than 0 when meridiem is specified" ,
198
+ ) ) ) ;
199
+ return Err ( ErrMode :: Cut ( ctx_err) ) ;
200
+ }
201
+
202
+ let mut h = h % 12 ;
203
+ if let Meridiem :: Pm = meridiem {
204
+ h += 12 ;
205
+ }
206
+ Ok ( Time {
207
+ hour : h,
208
+ minute : m. unwrap_or ( 0 ) ,
209
+ second : s. unwrap_or ( 0.0 ) ,
210
+ offset : None ,
203
211
} )
204
- . parse_next ( input)
205
212
}
206
213
207
214
/// Parse a colon preceded by whitespace
@@ -626,6 +633,12 @@ mod tests {
626
633
}
627
634
}
628
635
636
+ #[ test]
637
+ fn invalid ( ) {
638
+ assert ! ( parse( & mut "00:00am" ) . is_err( ) ) ;
639
+ assert ! ( parse( & mut "00:00:00am" ) . is_err( ) ) ;
640
+ }
641
+
629
642
#[ test]
630
643
fn hours_only ( ) {
631
644
let reference = Time {
0 commit comments