Skip to content

Commit 02174f0

Browse files
[expr] Add support for choices values
If syscfg value is a choice, it's evaluated as an identifier so we need to add special handling in such case - if identifier is evaluated directly "from" entry, we should first check if value is a valid choice.
1 parent 3205dd2 commit 02174f0

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

newt/syscfg/eval.go

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ func (cfg *Cfg) exprEvalBinaryExpr(e *ast.BinaryExpr) (int, error) {
7979
var y interface{}
8080
var err error
8181

82-
x, err = cfg.exprEvalNode(e.X)
82+
x, err = cfg.exprEvalNode(e.X, nil)
8383
if err != nil {
8484
return 0, err
8585
}
86-
y, err = cfg.exprEvalNode(e.Y)
86+
y, err = cfg.exprEvalNode(e.Y, nil)
8787
if err != nil {
8888
return 0, err
8989
}
@@ -148,7 +148,7 @@ func (cfg *Cfg) exprEvalUnaryExpr(e *ast.UnaryExpr) (int, error) {
148148
return 0, util.FmtNewtError("Invalid \"%s\" operator in expression", e.Op.String())
149149
}
150150

151-
x, err := cfg.exprEvalNode(e.X)
151+
x, err := cfg.exprEvalNode(e.X, nil)
152152
if err != nil {
153153
return 0, err
154154
}
@@ -201,7 +201,7 @@ func (cfg *Cfg) exprEvalCallExpr(e *ast.CallExpr) (interface{}, error) {
201201
argv := []interface{}{}
202202
argvs := []string{}
203203
for _, node := range e.Args {
204-
arg, err := cfg.exprEvalNode(node)
204+
arg, err := cfg.exprEvalNode(node, nil)
205205
if err != nil {
206206
return 0, err
207207
}
@@ -271,9 +271,17 @@ func (cfg *Cfg) exprEvalCallExpr(e *ast.CallExpr) (interface{}, error) {
271271
return ret, nil
272272
}
273273

274-
func (cfg *Cfg) exprEvalIdentifier(e *ast.Ident) (interface{}, error) {
274+
func (cfg *Cfg) exprEvalIdentifier(e *ast.Ident, parentEntry *CfgEntry) (interface{}, error) {
275275
name := e.Name
276276

277+
if parentEntry != nil {
278+
for _, s := range parentEntry.ValidChoices {
279+
if s == name {
280+
return s, nil
281+
}
282+
}
283+
}
284+
277285
entry, ok := cfg.Settings[name]
278286
if !ok {
279287
fixedName := name
@@ -308,7 +316,7 @@ func (cfg *Cfg) exprEvalIdentifier(e *ast.Ident) (interface{}, error) {
308316
return val, err
309317
}
310318

311-
func (cfg *Cfg) exprEvalNode(node ast.Node) (interface{}, error) {
319+
func (cfg *Cfg) exprEvalNode(node ast.Node, parentEntry *CfgEntry) (interface{}, error) {
312320
switch e := node.(type) {
313321
case *ast.BasicLit:
314322
return cfg.exprEvalLiteral(e)
@@ -319,9 +327,9 @@ func (cfg *Cfg) exprEvalNode(node ast.Node) (interface{}, error) {
319327
case *ast.CallExpr:
320328
return cfg.exprEvalCallExpr(e)
321329
case *ast.Ident:
322-
return cfg.exprEvalIdentifier(e)
330+
return cfg.exprEvalIdentifier(e, parentEntry)
323331
case *ast.ParenExpr:
324-
return cfg.exprEvalNode(e.X)
332+
return cfg.exprEvalNode(e.X, nil)
325333
}
326334

327335
return 0, util.FmtNewtError("Invalid token in expression")

0 commit comments

Comments
 (0)