Compare commits
No commits in common. "11969428018f479d3d54eb931d62d314f6f063d5" and "877f85ef782b16fc253c0cb1c48108f505672e27" have entirely different histories.
1196942801
...
877f85ef78
1
ast.go
1
ast.go
@ -115,7 +115,6 @@ func executeCmd(cmd *Command) error {
|
||||
}
|
||||
}
|
||||
}
|
||||
delete(Vars, *RptLoop.IndexVar)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
88
scpt.go
88
scpt.go
@ -98,57 +98,51 @@ func ParseValue(val *Value) (interface{}, error) {
|
||||
// Return value of provided key
|
||||
return Vars[*val.VarVal], nil
|
||||
} else if val.Expr != nil {
|
||||
// Return evaluated expression
|
||||
return evalExpr(*val.Expr)
|
||||
// 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 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
|
||||
|
Loading…
Reference in New Issue
Block a user