@@ -223,32 +223,32 @@ impl Type for Vec<Range<u32>> {
223
223
} )
224
224
} ;
225
225
226
- let component = |s : & mut Scanner , offset : usize | -> Result < u32 , TypeError > {
227
- loop {
228
- let num = number ( s, offset) ?;
229
- s. eat_whitespace ( ) ;
230
- if !s. eat_if ( ':' ) {
231
- return Ok ( num) ;
232
- }
233
- }
234
- } ;
235
-
236
226
for ( range_candidate, span) in
237
227
range_vecs. iter ( ) . map ( |f| ( f. format_verbatim ( ) , f. span ( ) ) )
238
228
{
239
229
let mut s = Scanner :: new ( & range_candidate) ;
240
- let start = component ( & mut s, span. start ) ?;
230
+ let start = number ( & mut s, span. start ) ?;
241
231
s. eat_whitespace ( ) ;
242
232
243
233
// The double and triple hyphen is converted into en dashes and em
244
234
// dashes earlier.
245
235
if !s. eat_if ( [ '-' , '–' , '—' ] ) {
246
236
res. push ( start..start) ;
237
+ if !s. done ( ) {
238
+ return Err ( TypeError :: new ( span, TypeErrorKind :: InvalidNumber ) ) ;
239
+ }
247
240
continue ;
248
241
}
249
242
s. eat_while ( '-' ) ;
250
243
s. eat_whitespace ( ) ;
251
- let end = component ( & mut s, span. start ) ?;
244
+ let offset = s. cursor ( ) ;
245
+ let end = number ( & mut s, span. start ) ?;
246
+ if !s. done ( ) {
247
+ return Err ( TypeError :: new (
248
+ offset..span. end ,
249
+ TypeErrorKind :: InvalidNumber ,
250
+ ) ) ;
251
+ }
252
252
res. push ( start..end) ;
253
253
}
254
254
@@ -473,7 +473,7 @@ impl Type for Gender {
473
473
#[ cfg( test) ]
474
474
mod tests {
475
475
use super :: * ;
476
- use crate :: chunk:: tests:: * ;
476
+ use crate :: { chunk:: tests:: * , Bibliography } ;
477
477
478
478
#[ test]
479
479
fn test_ranges ( ) {
@@ -491,4 +491,22 @@ mod tests {
491
491
assert_eq ! ( res[ 0 ] , 34 ..34 ) ;
492
492
assert_eq ! ( res[ 1 ] , 37 ..39 ) ;
493
493
}
494
+
495
+ #[ test]
496
+ fn test_hayagriva_issue_340 ( ) {
497
+ let bib = Bibliography :: parse (
498
+ r#"@inproceedings{test,
499
+ author = {John Doe},
500
+ title = {Interesting Findings},
501
+ journal = {Example Journal},
502
+ year = {2024},
503
+ pages = {1A1}
504
+ }"# ,
505
+ )
506
+ . unwrap ( ) ;
507
+ let t = bib. get ( "test" ) . unwrap ( ) ;
508
+ let pages = t. get ( "pages" ) . unwrap ( ) ;
509
+ let parsed: PermissiveType < std:: ops:: Range < u32 > > = pages. parse ( ) . unwrap ( ) ; `
510
+ assert ! ( matches!( parsed, PermissiveType :: Chunks ( _) ) )
511
+ }
494
512
}
0 commit comments