Clean up ParseValue()
This commit is contained in:
parent
412079c20a
commit
1196942801
88
scpt.go
88
scpt.go
@ -98,51 +98,57 @@ func ParseValue(val *Value) (interface{}, error) {
|
|||||||
// Return value of provided key
|
// Return value of provided key
|
||||||
return Vars[*val.VarVal], nil
|
return Vars[*val.VarVal], nil
|
||||||
} else if val.Expr != nil {
|
} else if val.Expr != nil {
|
||||||
// Parse value of left side of expression
|
// Return evaluated expression
|
||||||
left, _ := callIfFunc(ParseValue(val.Expr.Left))
|
return evalExpr(*val.Expr)
|
||||||
// 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 nil, nil
|
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
|
// Add quotes to an unquoted string
|
||||||
func requoteStr(s string) string {
|
func requoteStr(s string) string {
|
||||||
// Return quoted string
|
// Return quoted string
|
||||||
|
Loading…
Reference in New Issue
Block a user