fix: parse variables

This commit is contained in:
debugtalk
2021-09-29 11:07:40 +08:00
parent e3dc6ccb32
commit e54ddfebec
2 changed files with 45 additions and 22 deletions

View File

@@ -47,13 +47,24 @@ var (
// parseString parse string with variables // parseString parse string with variables
func parseString(raw string, variablesMapping map[string]interface{}) interface{} { func parseString(raw string, variablesMapping map[string]interface{}) interface{} {
matchStartPosition := strings.Index(raw, "$") matchStartPosition := 0
if matchStartPosition == -1 { // no $ found parsedString := ""
return raw remainedString := raw
}
parsedString := raw[0:matchStartPosition]
for matchStartPosition < len(raw) { for matchStartPosition < len(raw) {
// locate $ char position
startPosition := strings.Index(remainedString, "$")
if startPosition == -1 { // no $ found
// append remained string
parsedString += remainedString
break
}
// found $, check if variable or function
matchStartPosition += startPosition
parsedString += remainedString[0:startPosition]
remainedString = remainedString[startPosition:]
// search variable like ${var} or $var // search variable like ${var} or $var
varMatched := regexCompileVariable.FindStringSubmatch(raw[matchStartPosition:]) varMatched := regexCompileVariable.FindStringSubmatch(raw[matchStartPosition:])
if len(varMatched) == 3 { if len(varMatched) == 3 {
@@ -70,27 +81,12 @@ func parseString(raw string, variablesMapping map[string]interface{}) interface{
return varValue return varValue
} }
parsedString += fmt.Sprintf("%v", varValue)
matchStartPosition += len(varMatched[0]) matchStartPosition += len(varMatched[0])
parsedString += fmt.Sprintf("%v", varValue)
remainedString = raw[matchStartPosition:]
log.Printf("[parseString] parsedString: %v, matchStartPosition: %v", parsedString, matchStartPosition) log.Printf("[parseString] parsedString: %v, matchStartPosition: %v", parsedString, matchStartPosition)
continue continue
} }
currentPosition := matchStartPosition
var remainedString string
// find next $ location
nextStartPosition := strings.Index(raw[currentPosition+1:], "$")
if nextStartPosition == -1 { // no $ found
remainedString = raw[currentPosition:]
// break loop
matchStartPosition = len(raw)
} else { // found next $
matchStartPosition = nextStartPosition
remainedString = raw[currentPosition:nextStartPosition]
}
// append remained string
parsedString += remainedString
} }
return parsedString return parsedString

View File

@@ -55,4 +55,31 @@ func TestParseDataStringWithVariables(t *testing.T) {
if !assert.Equal(t, "abc#XYZ", parseData("${var_1}#XYZ", variablesMapping)) { if !assert.Equal(t, "abc#XYZ", parseData("${var_1}#XYZ", variablesMapping)) {
t.Fail() t.Fail()
} }
if !assert.Equal(t, "/abc/def/var3", parseData("/$var_1/$var_2/var3", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, 123, parseData("$var_3", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, map[string]interface{}{"a": 1}, parseData("$var_4", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, true, parseData("$var_5", variablesMapping)) {
t.Fail()
}
if !assert.Equal(t, nil, parseData("$var_6", variablesMapping)) {
t.Fail()
}
// TODO: fix compatibility with python version, "abc{'a': 1}"
if !assert.Equal(t, "abcmap[a:1]", parseData("abc$var_4", variablesMapping)) {
t.Fail()
}
// TODO: fix compatibility with python version, "abcTrue"
if !assert.Equal(t, "abctrue", parseData("abc$var_5", variablesMapping)) {
t.Fail()
}
// TODO: fix compatibility with python version, raise exception
if !assert.Equal(t, "/api/<nil>", parseData("/api/$SECRET_KEY", variablesMapping)) {
t.Fail()
}
} }