sg/internal/armtemplateparser/armtemplateparser.go (30 lines of code) (raw):
package armtemplateparser
import (
"fmt"
"strings"
"github.com/open-policy-agent/opa/ast"
)
type visitor struct {
parentKey string
defaults map[ast.Value]ast.Value
}
func (v *visitor) Visit(x interface{}) ast.Visitor {
n, ok := x.(*ast.Term)
if ok {
// add key:val to defaults mapping
hasDefault := n.Get(ast.StringTerm("defaultValue"))
if hasDefault != nil {
k := fmt.Sprintf("[parameters(%s)]", v.parentKey)
key := ast.StringTerm(k)
v.defaults[key.Value] = hasDefault.Value
} else {
v.parentKey = strings.ReplaceAll(n.String(), "\"", "'")
}
// query defaults mapping
if val, exists := v.defaults[n.Value]; exists {
n.Value = val
}
}
return v
}
// Replaces parameters with their default values in ARM templates
//
// It renders expressions like:
//
// "[parameters('paramName')]" -> "defaultParamName"
//
// by substituting the parameter values from the provided default value.
func ParseArmTemplateDefaults(t *ast.Term) {
ast.Walk(&visitor{defaults: map[ast.Value]ast.Value{}}, t)
}