| // Copyright IBM Corp. 2014, 2026 | |
| // SPDX-License-Identifier: BUSL-1.1 | |
| package instances | |
| import ( | |
| "github.com/zclconf/go-cty/cty" | |
| ) | |
| // RepetitionData represents the values available to identify individual | |
| // repetitions of a particular object. | |
| // | |
| // This corresponds to the each.key, each.value, and count.index symbols in | |
| // the configuration language. | |
| type RepetitionData struct { | |
| // CountIndex is the value for count.index, or cty.NilVal if evaluating | |
| // in a context where the "count" argument is not active. | |
| // | |
| // For correct operation, this should always be of type cty.Number if not | |
| // nil. | |
| CountIndex cty.Value | |
| // EachKey and EachValue are the values for each.key and each.value | |
| // respectively, or cty.NilVal if evaluating in a context where the | |
| // "for_each" argument is not active. These must either both be set | |
| // or neither set. | |
| // | |
| // For correct operation, EachKey must always be either of type cty.String | |
| // or cty.Number if not nil. | |
| EachKey, EachValue cty.Value | |
| } | |
| // TotallyUnknownRepetitionData is a [RepetitionData] value for situations | |
| // where don't even know yet what type of repetition will be used. | |
| var TotallyUnknownRepetitionData = RepetitionData{ | |
| CountIndex: cty.UnknownVal(cty.Number), | |
| EachKey: cty.UnknownVal(cty.String), | |
| EachValue: cty.DynamicVal, | |
| } | |
| // UnknownCountRepetitionData is a suitable [RepetitionData] value to use when | |
| // evaluating the configuration of an object which has a count argument that | |
| // is currently unknown. | |
| var UnknownCountRepetitionData = RepetitionData{ | |
| CountIndex: cty.UnknownVal(cty.Number), | |
| } | |
| // UnknownForEachRepetitionData generates a suitable [RepetitionData] value to | |
| // use when evaluating the configuration of an object whose for_each argument | |
| // is currently unknown. | |
| // | |
| // forEachType should be the type constraint of the unknown for_each argument | |
| // value. This should be of a type that is valid to use in for_each, but | |
| // if not then this will just return a very general RepetitionData that would | |
| // be suitable (but less specific) for any valid for_each value. | |
| func UnknownForEachRepetitionData(forEachType cty.Type) RepetitionData { | |
| switch { | |
| case forEachType.IsMapType(): | |
| return RepetitionData{ | |
| EachKey: cty.UnknownVal(cty.String), | |
| EachValue: cty.UnknownVal(forEachType.ElementType()), | |
| } | |
| case forEachType.IsSetType() && forEachType.ElementType().Equals(cty.String): | |
| return RepetitionData{ | |
| EachKey: cty.UnknownVal(cty.String), | |
| EachValue: cty.UnknownVal(cty.String), | |
| } | |
| default: | |
| // We know that each.key is always a string, at least. | |
| return RepetitionData{ | |
| EachKey: cty.UnknownVal(cty.String), | |
| EachValue: cty.DynamicVal, | |
| } | |
| } | |
| } |