diff --git a/scpt.go b/scpt.go index c88fbef..4816057 100644 --- a/scpt.go +++ b/scpt.go @@ -98,51 +98,57 @@ func ParseValue(val *Value) (interface{}, error) { // Return value of provided key return Vars[*val.VarVal], nil } else if val.Expr != nil { - // Parse value of left side of expression - left, _ := callIfFunc(ParseValue(val.Expr.Left)) - // If value is string, requote - if isStr(left) { - left = requoteStr(left.(string)) - } - // Create new nil string - var right string - // For every right segment - for _, segment := range val.Expr.RightSegs { - // Parse value of right segment, calling it if it is a function - rVal, _ := callIfFunc(ParseValue(segment.Right)) - // If value is string, requote - if isStr(rVal) { - rVal = requoteStr(rVal.(string)) - } - // Append right segment to right string - right = right + fmt.Sprintf( - " %s %v", - segment.Op, - rVal, - ) - } - // Create string expression from segments and operator - exp := fmt.Sprintf( - "%v %s", - left, - right, - ) - // Compile string expression - program, err := expr.Compile(strings.ReplaceAll(exp, "^", "**")) - if err != nil { - return nil, err - } - // Run expression - out, err := expr.Run(program, Vars) - if err != nil { - return nil, err - } - // Return expression output value - return out, nil + // Return evaluated expression + return evalExpr(*val.Expr) } return nil, nil } +// Evaluate given expression, returning its value and optionally an error +func evalExpr(expression Expression) (interface{}, error) { + // Parse value of left side of expression + left, _ := callIfFunc(ParseValue(expression.Left)) + // If value is string, requote + if isStr(left) { + left = requoteStr(left.(string)) + } + // Create new nil string + var right string + // For every right gsegment + for _, segment := range expression.RightSegs { + // Parse value of right segment, calling it if it is a function + rVal, _ := callIfFunc(ParseValue(segment.Right)) + // If value is string, requote + if isStr(rVal) { + rVal = requoteStr(rVal.(string)) + } + // Append right segment to right string + right = right + fmt.Sprintf( + " %s %v", + segment.Op, + rVal, + ) + } + // Create string expression from segments and operator + exp := fmt.Sprintf( + "%v %s", + left, + right, + ) + // Compile string expression + program, err := expr.Compile(strings.ReplaceAll(exp, "^", "**")) + if err != nil { + return nil, err + } + // Run expression + out, err := expr.Run(program, Vars) + if err != nil { + return nil, err + } + // Return expression output value + return out, nil +} + // Add quotes to an unquoted string func requoteStr(s string) string { // Return quoted string