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  }