diff --git a/extract/parameter.go b/extract/parameter.go index 222807d..15f1a0f 100644 --- a/extract/parameter.go +++ b/extract/parameter.go @@ -370,13 +370,11 @@ func nullableString(block *terraform.Block, key string) *string { if attr == nil || attr.IsNil() { return nil } - val := attr.Value() - if val.Type() != cty.String { + + str, ok := hclext.AsString(attr.Value()) + if !ok { return nil } - - //nolint:gocritic // string type asserted - str := val.AsString() return &str } @@ -385,13 +383,9 @@ func optionalString(block *terraform.Block, key string) string { if attr == nil || attr.IsNil() { return "" } - val := attr.Value() - if !val.Type().Equals(cty.String) { - return "" - } - //nolint:gocritic // string type asserted - return val.AsString() + str, _ := hclext.AsString(attr.Value()) + return str } func required(block *terraform.Block, keys ...string) hcl.Diagnostics { diff --git a/hclext/asstring.go b/hclext/asstring.go new file mode 100644 index 0000000..2f231ff --- /dev/null +++ b/hclext/asstring.go @@ -0,0 +1,26 @@ +package hclext + +import "github.com/zclconf/go-cty/cty" + +func AsString(v cty.Value) (string, bool) { + if v.IsNull() || !v.IsKnown() { + return "", false + } + + switch { + case v.Type().Equals(cty.String): + //nolint:gocritic // string type asserted + return v.AsString(), true + case v.Type().Equals(cty.Number): + // TODO: Float vs Int? + return v.AsBigFloat().String(), true + case v.Type().Equals(cty.Bool): + if v.True() { + return "true", true + } + return "false", true + + } + + return "", false +} diff --git a/types/value.go b/types/value.go index e26087b..e3ef163 100644 --- a/types/value.go +++ b/types/value.go @@ -7,6 +7,8 @@ import ( "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hclsyntax" "github.com/zclconf/go-cty/cty" + + "github.com/coder/preview/hclext" ) const ( @@ -86,20 +88,9 @@ func NullString() HCLString { // calling this function. func (s HCLString) AsString() string { if s.Valid() && s.Value.IsKnown() { - switch { - case s.Value.Type().Equals(cty.String): - //nolint:gocritic // string type asserted - return s.Value.AsString() - case s.Value.Type().Equals(cty.Number): - // TODO: Float vs Int? - return s.Value.AsBigFloat().String() - case s.Value.Type().Equals(cty.Bool): - if s.Value.True() { - return "true" - } - return "false" - default: - // ?? What to do? + str, ok := hclext.AsString(s.Value) + if ok { + return str } }