Strip dynamic types out of null and unknown values recursively #144
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The original issue is surfaced in terraform as hashicorp/terraform#32109
The root cause is that go-cty is not stripping dynamic information out of null values recursively, it only checks if the value itself is dynamic but not for example if it is a collection and has a dynamic element type. The new function behaves basically like
WithoutOptionalAttributesDeep
except it's taking away dynamic types where possible. If both the in and out types are dynamic then the function has no choice but to also return dynamic.This approach is the simplest from an architecture point of view, once we decide we are returning a null value then we recurse through the type and replace any dynamic types we would return. However, it's a bit inefficient as it recalculates things like unified types in objects and tuples when this work was already done. To fix that we could take the short circuit out entirely and have every conversion function handle null and unknown themselves, but that's a lot of changes needed and this is quite simple to implement and I don't think too negatively performant.