List types store an ordered collection of single element type.
By default, lists from schema (configuration, plan, and state) data are represented in the framework by types.ListType
and its associated value storage type of types.List
. These types fully support Terraform's type system concepts that cannot be represented in Go built-in types, such as a slice. Framework types can be extended by provider code or shared libraries to provide specific use case functionality.
Use one of the following attribute types to directly add a list of a single element type to a schema or nested attribute type:
Use one of the following attribute types to directly add a list of a nested attributes to a schema or nested attribute type:
If the list value should be the element type of another collection attribute type, set the ElementType
field to types.ListType{ElemType: /* ... */}
or the appropriate custom type.
If the list value should be a value type of an object attribute type, set the AttributeTypes
map value to types.ListType{ElemType: /* ... */}
or the appropriate custom type.
Tip
Review the attribute documentation to understand how schema-based data gets mapped into accessible values, such as a types.List
in this case.
Access types.List
information via the following methods:
(types.List).IsNull() bool
: Returns true
if the list is null.(types.List).IsUnknown() bool
: Returns true
if the list is unknown. Returns false
if the number of elements is known, any of which may be unknown.(types.List).Elements() []attr.Value
: Returns the known []attr.Value
value, or nil
if null or unknown.(types.List).ElementsAs(context.Context, any, bool) diag.Diagnostics
: Converts the known values into the given Go type, if possible. It is recommended to use a slice of framework types to account for elements which may be unknown.In this example, a list of strings value is checked for being null or unknown value first, before accessing its known value elements as a []types.String
:
// Example data model definition
// type ExampleModel struct {
// ExampleAttribute types.List `tfsdk:"example_attribute"`
// }
//
// This would be filled in, such as calling: req.Plan.Get(ctx, &data)
var data ExampleModel
// optional logic for handling null value
if data.ExampleAttribute.IsNull() {
// ...
}
// optional logic for handling unknown value
if data.ExampleAttribute.IsUnknown() {
// ...
}
elements := make([]types.String, 0, len(data.ExampleAttribute.Elements()))
diags := data.ExampleAttribute.ElementsAs(ctx, &elements, false)
Call one of the following to create a types.List
value:
types.ListNull(attr.Type) types.List
: A null list value with the given element type.types.ListUnknown(attr.Type) types.List
: An unknown list value with the given element type.types.ListValue(attr.Type, []attr.Value) (types.List, diag.Diagnostics)
: A known value with the given element type and values.types.ListValueFrom(context.Context, attr.Type, any) (types.List, diag.Diagnostics)
: A known value with the given element type and values. This can convert the source data from standard Go types into framework types as noted in the documentation for each element type, such as giving []*string
for a types.List
of types.String
.types.ListValueMust(attr.Type, []attr.Value) types.List
: A known value with the given element type and values. Any diagnostics are converted to a runtime panic. This is recommended only for testing or exhaustively tested logic.In this example, a known list value is created from framework types:
elements := []attr.Value{types.StringValue("one"), types.StringValue("two")}
listValue, diags := types.ListValue(types.StringType, elements)
Otherwise, for certain framework functionality that does not require types
implementations directly, such as:
(tfsdk.State).SetAttribute()
types.ListValueFrom()
types.MapValueFrom()
types.ObjectValueFrom()
types.SetValueFrom()
A Go built-in slice type ([]T
) or type alias of a slice type such as type MyListType []T
can be used instead.
In this example, a []string
is directly used to set a list attribute value:
elements := []string{"one", "two"}
diags := resp.State.SetAttribute(ctx, path.Root("example_attribute"), elements)
In this example, a types.List
of types.String
is created from a []string
:
elements := []string{"one", "two"}
listValue, diags := types.ListValueFrom(ctx, types.StringType, elements)
The framework supports extending its base type implementations with custom types. These can adjust expected provider code usage depending on their implementation.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4