diff options
Diffstat (limited to 'vendor/github.com/hashicorp/terraform/configs/configschema/empty_value.go')
-rw-r--r-- | vendor/github.com/hashicorp/terraform/configs/configschema/empty_value.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/vendor/github.com/hashicorp/terraform/configs/configschema/empty_value.go b/vendor/github.com/hashicorp/terraform/configs/configschema/empty_value.go new file mode 100644 index 0000000..005da56 --- /dev/null +++ b/vendor/github.com/hashicorp/terraform/configs/configschema/empty_value.go | |||
@@ -0,0 +1,59 @@ | |||
1 | package configschema | ||
2 | |||
3 | import ( | ||
4 | "github.com/zclconf/go-cty/cty" | ||
5 | ) | ||
6 | |||
7 | // EmptyValue returns the "empty value" for the recieving block, which for | ||
8 | // a block type is a non-null object where all of the attribute values are | ||
9 | // the empty values of the block's attributes and nested block types. | ||
10 | // | ||
11 | // In other words, it returns the value that would be returned if an empty | ||
12 | // block were decoded against the recieving schema, assuming that no required | ||
13 | // attribute or block constraints were honored. | ||
14 | func (b *Block) EmptyValue() cty.Value { | ||
15 | vals := make(map[string]cty.Value) | ||
16 | for name, attrS := range b.Attributes { | ||
17 | vals[name] = attrS.EmptyValue() | ||
18 | } | ||
19 | for name, blockS := range b.BlockTypes { | ||
20 | vals[name] = blockS.EmptyValue() | ||
21 | } | ||
22 | return cty.ObjectVal(vals) | ||
23 | } | ||
24 | |||
25 | // EmptyValue returns the "empty value" for the receiving attribute, which is | ||
26 | // the value that would be returned if there were no definition of the attribute | ||
27 | // at all, ignoring any required constraint. | ||
28 | func (a *Attribute) EmptyValue() cty.Value { | ||
29 | return cty.NullVal(a.Type) | ||
30 | } | ||
31 | |||
32 | // EmptyValue returns the "empty value" for when there are zero nested blocks | ||
33 | // present of the receiving type. | ||
34 | func (b *NestedBlock) EmptyValue() cty.Value { | ||
35 | switch b.Nesting { | ||
36 | case NestingSingle: | ||
37 | return cty.NullVal(b.Block.ImpliedType()) | ||
38 | case NestingGroup: | ||
39 | return b.Block.EmptyValue() | ||
40 | case NestingList: | ||
41 | if ty := b.Block.ImpliedType(); ty.HasDynamicTypes() { | ||
42 | return cty.EmptyTupleVal | ||
43 | } else { | ||
44 | return cty.ListValEmpty(ty) | ||
45 | } | ||
46 | case NestingMap: | ||
47 | if ty := b.Block.ImpliedType(); ty.HasDynamicTypes() { | ||
48 | return cty.EmptyObjectVal | ||
49 | } else { | ||
50 | return cty.MapValEmpty(ty) | ||
51 | } | ||
52 | case NestingSet: | ||
53 | return cty.SetValEmpty(b.Block.ImpliedType()) | ||
54 | default: | ||
55 | // Should never get here because the above is intended to be exhaustive, | ||
56 | // but we'll be robust and return a result nonetheless. | ||
57 | return cty.NullVal(cty.DynamicPseudoType) | ||
58 | } | ||
59 | } | ||