diff --git a/internal/lang/marks/marks.go b/internal/lang/marks/marks.go index bdda72ee5..93a731e71 100644 --- a/internal/lang/marks/marks.go +++ b/internal/lang/marks/marks.go @@ -2,6 +2,8 @@ package marks import ( "strings" + + "github.com/zclconf/go-cty/cty" ) // valueMarks allow creating strictly typed values for use as cty.Value marks. @@ -13,6 +15,25 @@ func (m valueMark) GoString() string { return "marks." + strings.Title(string(m)) } +// Has returns true if and only if the cty.Value has the given mark. +func Has(val cty.Value, mark valueMark) bool { + return val.HasMark(mark) +} + +// Contains returns true if the cty.Value or any any value within it contains +// the given mark. +func Contains(val cty.Value, mark valueMark) bool { + ret := false + cty.Walk(val, func(_ cty.Path, v cty.Value) (bool, error) { + if v.HasMark(mark) { + ret = true + return false, nil + } + return true, nil + }) + return ret +} + // Sensitive indicates that this value is marked as sensitive in the context of // Terraform. var Sensitive = valueMark("sensitive")