mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-28 18:01:01 -06:00
7c8efe103e
Some of the fields in our config structs are either mandatory in primary files or there is a default value that we apply if absent. Unfortunately override files impose the additional constraint that we be allowed to omit required fields (which have presumably already been set in the primary files) and that we are able to distinguish between a default value and omitting a value entirely. Since most of our fields were already acceptable for override files, here we just add some new fields to deal with the few cases where special handling is required and a helper function to disable the "Required" flag on attributes in a given schema.
46 lines
1.6 KiB
Go
46 lines
1.6 KiB
Go
package configs
|
|
|
|
import (
|
|
"github.com/hashicorp/hcl2/hcl"
|
|
"github.com/hashicorp/hcl2/hcl/hclsyntax"
|
|
)
|
|
|
|
// exprIsNativeQuotedString determines whether the given expression looks like
|
|
// it's a quoted string in the HCL native syntax.
|
|
//
|
|
// This should be used sparingly only for situations where our legacy HCL
|
|
// decoding would've expected a keyword or reference in quotes but our new
|
|
// decoding expects the keyword or reference to be provided directly as
|
|
// an identifier-based expression.
|
|
func exprIsNativeQuotedString(expr hcl.Expression) bool {
|
|
_, ok := expr.(*hclsyntax.TemplateExpr)
|
|
return ok
|
|
}
|
|
|
|
// schemaForOverrides takes a *hcl.BodySchema and produces a new one that is
|
|
// equivalent except that any required attributes are forced to not be required.
|
|
//
|
|
// This is useful for dealing with "override" config files, which are allowed
|
|
// to omit things that they don't wish to override from the main configuration.
|
|
//
|
|
// The returned schema may have some pointers in common with the given schema,
|
|
// so neither the given schema nor the returned schema should be modified after
|
|
// using this function in order to avoid confusion.
|
|
//
|
|
// Overrides are rarely used, so it's recommended to just create the override
|
|
// schema on the fly only when it's needed, rather than storing it in a global
|
|
// variable as we tend to do for a primary schema.
|
|
func schemaForOverrides(schema *hcl.BodySchema) *hcl.BodySchema {
|
|
ret := &hcl.BodySchema{
|
|
Attributes: make([]hcl.AttributeSchema, len(schema.Attributes)),
|
|
Blocks: schema.Blocks,
|
|
}
|
|
|
|
for i, attrS := range schema.Attributes {
|
|
ret.Attributes[i] = attrS
|
|
ret.Attributes[i].Required = false
|
|
}
|
|
|
|
return ret
|
|
}
|