mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-30 10:47:14 -06:00
31349a9c3a
This is part of a general effort to move all of Terraform's non-library package surface under internal in order to reinforce that these are for internal use within Terraform only. If you were previously importing packages under this prefix into an external codebase, you could pin to an earlier release tag as an interim solution until you've make a plan to achieve the same functionality some other way.
72 lines
2.0 KiB
Go
72 lines
2.0 KiB
Go
package configs
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
version "github.com/hashicorp/go-version"
|
|
"github.com/hashicorp/hcl/v2"
|
|
"github.com/zclconf/go-cty/cty"
|
|
"github.com/zclconf/go-cty/cty/convert"
|
|
)
|
|
|
|
// VersionConstraint represents a version constraint on some resource
|
|
// (e.g. Terraform Core, a provider, a module, ...) that carries with it
|
|
// a source range so that a helpful diagnostic can be printed in the event
|
|
// that a particular constraint does not match.
|
|
type VersionConstraint struct {
|
|
Required version.Constraints
|
|
DeclRange hcl.Range
|
|
}
|
|
|
|
func decodeVersionConstraint(attr *hcl.Attribute) (VersionConstraint, hcl.Diagnostics) {
|
|
ret := VersionConstraint{
|
|
DeclRange: attr.Range,
|
|
}
|
|
|
|
val, diags := attr.Expr.Value(nil)
|
|
if diags.HasErrors() {
|
|
return ret, diags
|
|
}
|
|
var err error
|
|
val, err = convert.Convert(val, cty.String)
|
|
if err != nil {
|
|
diags = append(diags, &hcl.Diagnostic{
|
|
Severity: hcl.DiagError,
|
|
Summary: "Invalid version constraint",
|
|
Detail: fmt.Sprintf("A string value is required for %s.", attr.Name),
|
|
Subject: attr.Expr.Range().Ptr(),
|
|
})
|
|
return ret, diags
|
|
}
|
|
|
|
if val.IsNull() {
|
|
// A null version constraint is strange, but we'll just treat it
|
|
// like an empty constraint set.
|
|
return ret, diags
|
|
}
|
|
|
|
if !val.IsWhollyKnown() {
|
|
// If there is a syntax error, HCL sets the value of the given attribute
|
|
// to cty.DynamicVal. A diagnostic for the syntax error will already
|
|
// bubble up, so we will move forward gracefully here.
|
|
return ret, diags
|
|
}
|
|
|
|
constraintStr := val.AsString()
|
|
constraints, err := version.NewConstraint(constraintStr)
|
|
if err != nil {
|
|
// NewConstraint doesn't return user-friendly errors, so we'll just
|
|
// ignore the provided error and produce our own generic one.
|
|
diags = append(diags, &hcl.Diagnostic{
|
|
Severity: hcl.DiagError,
|
|
Summary: "Invalid version constraint",
|
|
Detail: "This string does not use correct version constraint syntax.", // Not very actionable :(
|
|
Subject: attr.Expr.Range().Ptr(),
|
|
})
|
|
return ret, diags
|
|
}
|
|
|
|
ret.Required = constraints
|
|
return ret, diags
|
|
}
|