@@ -702,21 +702,47 @@ pub(crate) fn decode_unquoted_key<'i>(
702702 ) ;
703703 }
704704
705- for ( i, b) in s. as_bytes ( ) . iter ( ) . enumerate ( ) {
706- if !UNQUOTED_CHAR . contains_token ( b) {
707- error. report_error (
708- ParseError :: new ( "invalid unquoted key" )
709- . with_context ( Span :: new_unchecked ( 0 , s. len ( ) ) )
710- . with_expected ( & [
711- Expected :: Description ( "letters" ) ,
712- Expected :: Description ( "numbers" ) ,
713- Expected :: Literal ( "-" ) ,
714- Expected :: Literal ( "_" ) ,
715- ] )
716- . with_unexpected ( Span :: new_unchecked ( i, i) ) ,
717- ) ;
705+ let mut span = None ;
706+ for ( i, _b) in s
707+ . as_bytes ( )
708+ . iter ( )
709+ . enumerate ( )
710+ . filter ( |( _, b) | !UNQUOTED_CHAR . contains_token ( * b) )
711+ {
712+ if let Some ( ( start, end) ) = span {
713+ if i == end {
714+ span = Some ( ( start, i + 1 ) ) ;
715+ } else {
716+ error. report_error (
717+ ParseError :: new ( "invalid unquoted key" )
718+ . with_context ( Span :: new_unchecked ( 0 , s. len ( ) ) )
719+ . with_expected ( & [
720+ Expected :: Description ( "letters" ) ,
721+ Expected :: Description ( "numbers" ) ,
722+ Expected :: Literal ( "-" ) ,
723+ Expected :: Literal ( "_" ) ,
724+ ] )
725+ . with_unexpected ( Span :: new_unchecked ( start, end) ) ,
726+ ) ;
727+ span = Some ( ( i, i + 1 ) ) ;
728+ }
729+ } else {
730+ span = Some ( ( i, i + 1 ) ) ;
718731 }
719732 }
733+ if let Some ( ( start, end) ) = span {
734+ error. report_error (
735+ ParseError :: new ( "invalid unquoted key" )
736+ . with_context ( Span :: new_unchecked ( 0 , s. len ( ) ) )
737+ . with_expected ( & [
738+ Expected :: Description ( "letters" ) ,
739+ Expected :: Description ( "numbers" ) ,
740+ Expected :: Literal ( "-" ) ,
741+ Expected :: Literal ( "_" ) ,
742+ ] )
743+ . with_unexpected ( Span :: new_unchecked ( start, end) ) ,
744+ ) ;
745+ }
720746
721747 if !output. push_str ( s) {
722748 error. report_error (
0 commit comments