From 696cd68913058baec9ce5e8d26eda3c488d8b1b7 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 3 Feb 2023 17:42:59 -0800 Subject: [PATCH] command/views: Describe unknown collection bounds in diagnostics --- internal/command/views/json/diagnostic.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/internal/command/views/json/diagnostic.go b/internal/command/views/json/diagnostic.go index ea7a409d66..9e2e7a5464 100644 --- a/internal/command/views/json/diagnostic.go +++ b/internal/command/views/json/diagnostic.go @@ -318,7 +318,27 @@ func NewDiagnostic(diag tfdiags.Diagnostic, sources map[string][]byte) *Diagnost // unknown value even when it isn't. if ty := val.Type(); ty != cty.DynamicPseudoType { if includeUnknown { - value.Statement = fmt.Sprintf("is a %s, known only after apply", ty.FriendlyName()) + switch { + case ty.IsCollectionType(): + valRng := val.Range() + minLen := valRng.LengthLowerBound() + maxLen := valRng.LengthUpperBound() + const maxLimit = 1024 // (upper limit is just an arbitrary value to avoid showing distracting large numbers in the UI) + switch { + case minLen == maxLen: + value.Statement = fmt.Sprintf("is a %s of length %d, known only after apply", ty.FriendlyName(), minLen) + case minLen != 0 && maxLen <= maxLimit: + value.Statement = fmt.Sprintf("is a %s with between %d and %d elements, known only after apply", ty.FriendlyName(), minLen, maxLen) + case minLen != 0: + value.Statement = fmt.Sprintf("is a %s with at least %d elements, known only after apply", ty.FriendlyName(), minLen) + case maxLen <= maxLimit: + value.Statement = fmt.Sprintf("is a %s with up to %d elements, known only after apply", ty.FriendlyName(), maxLen) + default: + value.Statement = fmt.Sprintf("is a %s, known only after apply", ty.FriendlyName()) + } + default: + value.Statement = fmt.Sprintf("is a %s, known only after apply", ty.FriendlyName()) + } } else { value.Statement = fmt.Sprintf("is a %s", ty.FriendlyName()) }