@@ -138,9 +138,10 @@ pub(super) fn iso1(input: &mut &str) -> ModalResult<Date> {
138138 let ( year, _, month, _, day) =
139139 ( year_str, s ( '-' ) , s ( dec_uint) , s ( '-' ) , s ( dec_uint) ) . parse_next ( input) ?;
140140
141+ // Map err to Backtrack instead of Cut to avoid early termination of parsing
141142 ( year, month, day)
142143 . try_into ( )
143- . map_err ( |e| ErrMode :: Cut ( ctx_err ( e) ) )
144+ . map_err ( |e| ErrMode :: Backtrack ( ctx_err ( e) ) )
144145}
145146
146147/// Parse `[year][month][day]`
@@ -156,7 +157,7 @@ pub(super) fn iso2(input: &mut &str) -> ModalResult<Date> {
156157
157158 ( year, month, day)
158159 . try_into ( )
159- . map_err ( |e| ErrMode :: Cut ( ctx_err ( e) ) )
160+ . map_err ( |e| ErrMode :: Backtrack ( ctx_err ( e) ) )
160161}
161162
162163/// Parse `[year]/[month]/[day]` or `[month]/[day]/[year]` or `[month]/[day]`.
@@ -178,19 +179,21 @@ fn us(input: &mut &str) -> ModalResult<Date> {
178179 let day = day_from_str ( s2) ?;
179180 ( s1, n, day)
180181 . try_into ( )
181- . map_err ( |e| ErrMode :: Cut ( ctx_err ( e) ) )
182+ . map_err ( |e| ErrMode :: Backtrack ( ctx_err ( e) ) )
182183 }
183184 Some ( s2) => {
184185 // [month]/[day]/[year]
185186 let month = month_from_str ( s1) ?;
186187 ( s2, month, n)
187188 . try_into ( )
188- . map_err ( |e| ErrMode :: Cut ( ctx_err ( e) ) )
189+ . map_err ( |e| ErrMode :: Backtrack ( ctx_err ( e) ) )
189190 }
190191 None => {
191192 // [month]/[day]
192193 let month = month_from_str ( s1) ?;
193- ( month, n) . try_into ( ) . map_err ( |e| ErrMode :: Cut ( ctx_err ( e) ) )
194+ ( month, n)
195+ . try_into ( )
196+ . map_err ( |e| ErrMode :: Backtrack ( ctx_err ( e) ) )
194197 }
195198 }
196199}
@@ -213,10 +216,10 @@ fn literal1(input: &mut &str) -> ModalResult<Date> {
213216 match year {
214217 Some ( year) => ( year, month, day)
215218 . try_into ( )
216- . map_err ( |e| ErrMode :: Cut ( ctx_err ( e) ) ) ,
219+ . map_err ( |e| ErrMode :: Backtrack ( ctx_err ( e) ) ) ,
217220 None => ( month, day)
218221 . try_into ( )
219- . map_err ( |e| ErrMode :: Cut ( ctx_err ( e) ) ) ,
222+ . map_err ( |e| ErrMode :: Backtrack ( ctx_err ( e) ) ) ,
220223 }
221224}
222225
@@ -242,10 +245,10 @@ fn literal2(input: &mut &str) -> ModalResult<Date> {
242245 match year {
243246 Some ( year) => ( year, month, day)
244247 . try_into ( )
245- . map_err ( |e| ErrMode :: Cut ( ctx_err ( e) ) ) ,
248+ . map_err ( |e| ErrMode :: Backtrack ( ctx_err ( e) ) ) ,
246249 None => ( month, day)
247250 . try_into ( )
248- . map_err ( |e| ErrMode :: Cut ( ctx_err ( e) ) ) ,
251+ . map_err ( |e| ErrMode :: Backtrack ( ctx_err ( e) ) ) ,
249252 }
250253}
251254
@@ -274,12 +277,12 @@ fn literal_month(input: &mut &str) -> ModalResult<u8> {
274277
275278fn month_from_str ( s : & str ) -> ModalResult < u8 > {
276279 s. parse :: < u8 > ( )
277- . map_err ( |_| ErrMode :: Cut ( ctx_err ( "month must be a valid u8 number" ) ) )
280+ . map_err ( |_| ErrMode :: Backtrack ( ctx_err ( "month must be a valid u8 number" ) ) )
278281}
279282
280283fn day_from_str ( s : & str ) -> ModalResult < u8 > {
281284 s. parse :: < u8 > ( )
282- . map_err ( |_| ErrMode :: Cut ( ctx_err ( "day must be a valid u8 number" ) ) )
285+ . map_err ( |_| ErrMode :: Backtrack ( ctx_err ( "day must be a valid u8 number" ) ) )
283286}
284287
285288#[ cfg( test) ]
0 commit comments