github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/scanners/azure/resolver/resolver.go (about) 1 package resolver 2 3 import ( 4 "github.com/khulnasoft-lab/defsec/pkg/scanners/azure" 5 "github.com/khulnasoft-lab/defsec/pkg/scanners/azure/expressions" 6 defsecTypes "github.com/khulnasoft-lab/defsec/pkg/types" 7 ) 8 9 type Resolver interface { 10 ResolveExpression(expression azure.Value) azure.Value 11 SetDeployment(d *azure.Deployment) 12 } 13 14 func NewResolver() Resolver { 15 return &resolver{} 16 } 17 18 type resolver struct { 19 deployment *azure.Deployment 20 } 21 22 func (r *resolver) SetDeployment(d *azure.Deployment) { 23 r.deployment = d 24 } 25 26 func (r *resolver) ResolveExpression(expression azure.Value) azure.Value { 27 if expression.Kind != azure.KindExpression { 28 return expression 29 } 30 if r.deployment == nil { 31 panic("cannot resolve expression on nil deployment") 32 } 33 code := expression.AsString() 34 35 resolved, err := r.resolveExpressionString(code, expression.GetMetadata()) 36 if err != nil { 37 expression.Kind = azure.KindUnresolvable 38 return expression 39 } 40 return resolved 41 } 42 43 func (r *resolver) resolveExpressionString(code string, metadata defsecTypes.Metadata) (azure.Value, error) { 44 et, err := expressions.NewExpressionTree(code) 45 if err != nil { 46 return azure.NullValue, err 47 } 48 49 evaluatedValue := et.Evaluate(r.deployment) 50 return azure.NewValue(evaluatedValue, metadata), nil 51 }