Skip to content

Commit 5f38d06

Browse files
More scanning interpolation (#13)
1 parent 39cf4e9 commit 5f38d06

File tree

4 files changed

+103
-14
lines changed

4 files changed

+103
-14
lines changed

go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ require (
1515
github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1 // indirect
1616
github.com/charmbracelet/x/ansi v0.10.1 // indirect
1717
github.com/charmbracelet/x/cellbuf v0.0.13 // indirect
18-
github.com/charmbracelet/x/exp/charmtone v0.0.0-20250829135019-44e44e21330d // indirect
19-
github.com/charmbracelet/x/exp/color v0.0.0-20250829135019-44e44e21330d // indirect
18+
github.com/charmbracelet/x/exp/charmtone v0.0.0-20250903173649-ee062c847ed7 // indirect
19+
github.com/charmbracelet/x/exp/color v0.0.0-20250903173649-ee062c847ed7 // indirect
2020
github.com/charmbracelet/x/term v0.2.1 // indirect
2121
github.com/inconshreveable/mousetrap v1.1.0 // indirect
2222
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
@@ -27,7 +27,7 @@ require (
2727
github.com/muesli/mango-pflag v0.1.0 // indirect
2828
github.com/muesli/roff v0.1.0 // indirect
2929
github.com/rivo/uniseg v0.4.7 // indirect
30-
github.com/spf13/pflag v1.0.9 // indirect
30+
github.com/spf13/pflag v1.0.10 // indirect
3131
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
3232
go.followtheprocess.codes/hue v0.6.0 // indirect
3333
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b // indirect

go.sum

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ github.com/charmbracelet/x/ansi v0.10.1 h1:rL3Koar5XvX0pHGfovN03f5cxLbCF2YvLeyz7
1010
github.com/charmbracelet/x/ansi v0.10.1/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE=
1111
github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k=
1212
github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
13-
github.com/charmbracelet/x/exp/charmtone v0.0.0-20250829135019-44e44e21330d h1:CdWuPn52nEvBJifpVZGl+kHmDO85vlEIQNrcSTrYo9c=
14-
github.com/charmbracelet/x/exp/charmtone v0.0.0-20250829135019-44e44e21330d/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0=
15-
github.com/charmbracelet/x/exp/color v0.0.0-20250829135019-44e44e21330d h1:m/h6uxPy47dpZoxpCQJlbMdebMVdGI/gDpRnLKSn6dg=
16-
github.com/charmbracelet/x/exp/color v0.0.0-20250829135019-44e44e21330d/go.mod h1:hk/GyTELmEgX54pBAOHcFvH8Xed53JWo/g8kJXFo/PI=
13+
github.com/charmbracelet/x/exp/charmtone v0.0.0-20250903173649-ee062c847ed7 h1:4pPBy824w62/q5Jghat467jUY5UDmgLpnjRiWjawFLU=
14+
github.com/charmbracelet/x/exp/charmtone v0.0.0-20250903173649-ee062c847ed7/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0=
15+
github.com/charmbracelet/x/exp/color v0.0.0-20250903173649-ee062c847ed7 h1:Jp7r1KJ64bQsv2UfY0Tugo0mPUNhmDTDpt0rhh2jRpA=
16+
github.com/charmbracelet/x/exp/color v0.0.0-20250903173649-ee062c847ed7/go.mod h1:hk/GyTELmEgX54pBAOHcFvH8Xed53JWo/g8kJXFo/PI=
1717
github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99klV19u0QnhiizODirwVksQB91TJKV/UaTnACcG30=
1818
github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
1919
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
@@ -45,8 +45,9 @@ github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc
4545
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
4646
github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
4747
github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
48-
github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
4948
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
49+
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
50+
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
5051
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
5152
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
5253
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=

internal/syntax/scanner/scanner.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,9 @@ func scanIdent(s *Scanner) scanFn {
376376
// @var <value>
377377
// Note: value could be a timeout, hence alpha numeric
378378
return scanText
379+
case s.restHasPrefix("{{"):
380+
// @var {{ <value> }}
381+
return scanOpenInterp
379382
default:
380383
return scanStart
381384
}
@@ -446,8 +449,7 @@ func scanOpenInterp(s *Scanner) scanFn {
446449

447450
if isAlpha(s.peek()) {
448451
// We don't actually want to move to the next state yet
449-
// after the ident, just scan it and remember where we should
450-
// go next
452+
// after the ident, just scan it
451453
scanIdent(s)
452454
}
453455

internal/syntax/scanner/scanner_test.go

Lines changed: 90 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,18 @@ func TestBasics(t *testing.T) {
9999
{Kind: token.EOF, Start: 9, End: 9},
100100
},
101101
},
102+
{
103+
name: "variable no equals interp",
104+
src: "@var {{ test }}",
105+
want: []token.Token{
106+
{Kind: token.At, Start: 0, End: 1},
107+
{Kind: token.Ident, Start: 1, End: 4},
108+
{Kind: token.OpenInterp, Start: 5, End: 7},
109+
{Kind: token.Ident, Start: 8, End: 12},
110+
{Kind: token.CloseInterp, Start: 13, End: 15},
111+
{Kind: token.EOF, Start: 15, End: 15},
112+
},
113+
},
102114
{
103115
name: "name",
104116
src: "@name = MyRequest",
@@ -110,6 +122,19 @@ func TestBasics(t *testing.T) {
110122
{Kind: token.EOF, Start: 17, End: 17},
111123
},
112124
},
125+
{
126+
name: "name equals interp",
127+
src: "@name = {{ something }}",
128+
want: []token.Token{
129+
{Kind: token.At, Start: 0, End: 1},
130+
{Kind: token.Name, Start: 1, End: 5},
131+
{Kind: token.Eq, Start: 6, End: 7},
132+
{Kind: token.OpenInterp, Start: 8, End: 10},
133+
{Kind: token.Ident, Start: 11, End: 20},
134+
{Kind: token.CloseInterp, Start: 21, End: 23},
135+
{Kind: token.EOF, Start: 23, End: 23},
136+
},
137+
},
113138
{
114139
name: "name no equals",
115140
src: "@name MyRequest",
@@ -120,6 +145,18 @@ func TestBasics(t *testing.T) {
120145
{Kind: token.EOF, Start: 15, End: 15},
121146
},
122147
},
148+
{
149+
name: "name no equals interp",
150+
src: "@name {{ something }}",
151+
want: []token.Token{
152+
{Kind: token.At, Start: 0, End: 1},
153+
{Kind: token.Name, Start: 1, End: 5},
154+
{Kind: token.OpenInterp, Start: 6, End: 8},
155+
{Kind: token.Ident, Start: 9, End: 18},
156+
{Kind: token.CloseInterp, Start: 19, End: 21},
157+
{Kind: token.EOF, Start: 21, End: 21},
158+
},
159+
},
123160
{
124161
name: "hash request variable",
125162
src: "# @var = test",
@@ -131,6 +168,41 @@ func TestBasics(t *testing.T) {
131168
{Kind: token.EOF, Start: 13, End: 13},
132169
},
133170
},
171+
{
172+
name: "hash request variable no equals",
173+
src: "# @var test",
174+
want: []token.Token{
175+
{Kind: token.At, Start: 2, End: 3},
176+
{Kind: token.Ident, Start: 3, End: 6},
177+
{Kind: token.Text, Start: 7, End: 11},
178+
{Kind: token.EOF, Start: 11, End: 11},
179+
},
180+
},
181+
{
182+
name: "hash request variable interp",
183+
src: "# @var = {{ test }}",
184+
want: []token.Token{
185+
{Kind: token.At, Start: 2, End: 3},
186+
{Kind: token.Ident, Start: 3, End: 6},
187+
{Kind: token.Eq, Start: 7, End: 8},
188+
{Kind: token.OpenInterp, Start: 9, End: 11},
189+
{Kind: token.Ident, Start: 12, End: 16},
190+
{Kind: token.CloseInterp, Start: 17, End: 19},
191+
{Kind: token.EOF, Start: 19, End: 19},
192+
},
193+
},
194+
{
195+
name: "hash request variable interp no equals",
196+
src: "# @var {{ test }}",
197+
want: []token.Token{
198+
{Kind: token.At, Start: 2, End: 3},
199+
{Kind: token.Ident, Start: 3, End: 6},
200+
{Kind: token.OpenInterp, Start: 7, End: 9},
201+
{Kind: token.Ident, Start: 10, End: 14},
202+
{Kind: token.CloseInterp, Start: 15, End: 17},
203+
{Kind: token.EOF, Start: 17, End: 17},
204+
},
205+
},
134206
{
135207
name: "slash request variable",
136208
src: "// @var = test",
@@ -143,14 +215,28 @@ func TestBasics(t *testing.T) {
143215
},
144216
},
145217
{
146-
name: "slash request variable",
147-
src: "// @var = test",
218+
name: "slash request variable interp",
219+
src: "// @var = {{ test }}",
148220
want: []token.Token{
149221
{Kind: token.At, Start: 3, End: 4},
150222
{Kind: token.Ident, Start: 4, End: 7},
151223
{Kind: token.Eq, Start: 8, End: 9},
152-
{Kind: token.Text, Start: 10, End: 14},
153-
{Kind: token.EOF, Start: 14, End: 14},
224+
{Kind: token.OpenInterp, Start: 10, End: 12},
225+
{Kind: token.Ident, Start: 13, End: 17},
226+
{Kind: token.CloseInterp, Start: 18, End: 20},
227+
{Kind: token.EOF, Start: 20, End: 20},
228+
},
229+
},
230+
{
231+
name: "slash request variable interp no equals",
232+
src: "// @var {{ test }}",
233+
want: []token.Token{
234+
{Kind: token.At, Start: 3, End: 4},
235+
{Kind: token.Ident, Start: 4, End: 7},
236+
{Kind: token.OpenInterp, Start: 8, End: 10},
237+
{Kind: token.Ident, Start: 11, End: 15},
238+
{Kind: token.CloseInterp, Start: 16, End: 18},
239+
{Kind: token.EOF, Start: 18, End: 18},
154240
},
155241
},
156242
{

0 commit comments

Comments
 (0)