60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
package ruleset_v2
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
)
|
|
|
|
// parseFuncCall takes a string that look like foo("bar", "baz") and breaks it down
|
|
// into funcName = "foo" and params = []string{"bar", "baz"}]
|
|
func parseFuncCall(funcCall string) (funcName string, params []string, err error) {
|
|
// Splitting the input string into two parts: functionName and parameters
|
|
parts := strings.SplitN(funcCall, "(", 2)
|
|
if len(parts) != 2 {
|
|
return "", nil, errors.New("invalid function call format")
|
|
}
|
|
|
|
// get function name
|
|
funcName = strings.TrimSpace(parts[0])
|
|
|
|
// Removing the closing parenthesis from the parameters part
|
|
paramsPart := strings.TrimSuffix(parts[1], ")")
|
|
if len(paramsPart) == 0 {
|
|
// No parameters
|
|
return funcName, []string{}, nil
|
|
}
|
|
|
|
inQuote := false
|
|
inEscape := false
|
|
param := ""
|
|
for _, r := range paramsPart {
|
|
switch {
|
|
case inQuote && !inEscape && r == '\\':
|
|
inEscape = true
|
|
continue
|
|
case inEscape && inQuote && r == '"':
|
|
param += string(r)
|
|
inEscape = false
|
|
continue
|
|
case inEscape:
|
|
param += string(r)
|
|
inEscape = false
|
|
continue
|
|
case r == '"':
|
|
inQuote = !inQuote
|
|
if !inQuote {
|
|
params = append(params, param)
|
|
param = ""
|
|
}
|
|
continue
|
|
case !inQuote && r == ',':
|
|
continue
|
|
case inQuote:
|
|
param += string(r)
|
|
continue
|
|
}
|
|
}
|
|
|
|
return funcName, params, nil
|
|
}
|