Skip to content

Commit f868b86

Browse files
fix: do not replace '.' in floating point numbers
Co-authored-by: Markus Wolf <[email protected]>
1 parent 6ebcac3 commit f868b86

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

pkg/runner/expression.go

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@ import (
1515
log "github.com/sirupsen/logrus"
1616
)
1717

18-
var expressionPattern, operatorPattern *regexp.Regexp
18+
var expressionPattern, operatorPattern, floatPattern *regexp.Regexp
1919

2020
func init() {
2121
expressionPattern = regexp.MustCompile(`\${{\s*(.+?)\s*}}`)
2222
operatorPattern = regexp.MustCompile("^[!=><|&]+$")
23+
floatPattern = regexp.MustCompile(`-?(?:0|[1-9][0-9]*)\.[0-9]+`)
2324
}
2425

2526
// NewExpressionEvaluator creates a new evaluator
@@ -121,9 +122,10 @@ func (ee *expressionEvaluator) InterpolateWithStringCheck(in string) (string, bo
121122
// Rewrite tries to transform any javascript property accessor into its bracket notation.
122123
// For instance, "object.property" would become "object['property']".
123124
func (ee *expressionEvaluator) Rewrite(in string) string {
125+
floatIndizes := floatPattern.FindAllStringIndex(in, -1)
124126
var buf strings.Builder
125127
r := strings.NewReader(in)
126-
for {
128+
for i := 0; ; i++ {
127129
c, _, err := r.ReadRune()
128130
if err == io.EOF {
129131
break
@@ -136,14 +138,27 @@ func (ee *expressionEvaluator) Rewrite(in string) string {
136138
buf.WriteRune(c)
137139
ee.advString(&buf, r)
138140
case c == '.':
139-
buf.WriteString("['")
140-
ee.advPropertyName(&buf, r)
141-
buf.WriteString("']")
141+
if ee.isFloat(floatIndizes, i) {
142+
buf.WriteRune(c)
143+
} else {
144+
buf.WriteString("['")
145+
ee.advPropertyName(&buf, r)
146+
buf.WriteString("']")
147+
}
142148
}
143149
}
144150
return buf.String()
145151
}
146152

153+
func (*expressionEvaluator) isFloat(floatIndizes [][]int, index int) bool {
154+
for _, floatRange := range floatIndizes {
155+
if floatRange[0] < index && floatRange[1] > index {
156+
return true
157+
}
158+
}
159+
return false
160+
}
161+
147162
func (*expressionEvaluator) advString(w *strings.Builder, r *strings.Reader) error {
148163
for {
149164
c, _, err := r.ReadRune()

pkg/runner/expression_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ func TestEvaluate(t *testing.T) {
7878
{" 1 ", "1", ""},
7979
{"1 + 3", "4", ""},
8080
{"(1 + 3) * -2", "-8", ""},
81+
{"-9.2", "-9.2", ""},
82+
{"-9.2 + 5.1", "-4.1", ""},
8183
{"'my text'", "my text", ""},
8284
{"contains('my text', 'te')", "true", ""},
8385
{"contains('my TEXT', 'te')", "true", ""},

0 commit comments

Comments
 (0)