Skip to content

Commit 69a55f2

Browse files
fix: slurp underscores when processing string literals (#1)
1 parent d1ba18e commit 69a55f2

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

pkg/jsonpath/token.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ func (t *Tokenizer) Tokenize() Tokens {
485485
t.scanString(rune(ch))
486486
case isDigit(ch):
487487
t.scanNumber()
488-
case isLetter(ch):
488+
case isLiteralChar(ch):
489489
t.scanLiteral()
490490
default:
491491
t.addToken(ILLEGAL, 1, string(ch))
@@ -546,7 +546,7 @@ func (t *Tokenizer) scanNumber() {
546546
func (t *Tokenizer) scanLiteral() {
547547
start := t.pos
548548
for i := start; i < len(t.input); i++ {
549-
if !isLetter(t.input[i]) {
549+
if !isLiteralChar(t.input[i]) {
550550
literal := t.input[start:i]
551551
switch literal {
552552
case "true", "false":
@@ -606,8 +606,8 @@ func isDigit(ch byte) bool {
606606
return '0' <= ch && ch <= '9'
607607
}
608608

609-
func isLetter(ch byte) bool {
610-
return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z'
609+
func isLiteralChar(ch byte) bool {
610+
return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_'
611611
}
612612

613613
func isSpace(ch byte) bool {

pkg/jsonpath/token_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,19 @@ func TestTokenizer(t *testing.T) {
252252
{Token: BRACKET_RIGHT, Line: 1, Column: 13, Literal: "", Len: 1},
253253
},
254254
},
255+
{
256+
name: "Underscore is string literal character",
257+
input: "$.pagination._.next_results_cursor",
258+
expected: []TokenInfo{
259+
{Token: ROOT, Line: 1, Column: 0, Literal: "", Len: 1},
260+
{Token: CHILD, Line: 1, Column: 1, Literal: "", Len: 1},
261+
{Token: STRING_LITERAL, Line: 1, Column: 2, Literal: "pagination", Len: 10},
262+
{Token: CHILD, Line: 1, Column: 12, Literal: "", Len: 1},
263+
{Token: STRING_LITERAL, Line: 1, Column: 13, Literal: "_", Len: 1},
264+
{Token: CHILD, Line: 1, Column: 14, Literal: "", Len: 1},
265+
{Token: STRING_LITERAL, Line: 1, Column: 15, Literal: "next_results_cursor", Len: 19},
266+
},
267+
},
255268
//{
256269
// name: "Filter regular expression (illegal right now)",
257270
// input: "$[?(@.child=~/.*/)]",

0 commit comments

Comments
 (0)