diff options
Diffstat (limited to 'vendor/github.com/hashicorp/terraform/config/hcl2shim/single_attr_body.go')
-rw-r--r-- | vendor/github.com/hashicorp/terraform/config/hcl2shim/single_attr_body.go | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/vendor/github.com/hashicorp/terraform/config/hcl2shim/single_attr_body.go b/vendor/github.com/hashicorp/terraform/config/hcl2shim/single_attr_body.go new file mode 100644 index 0000000..19651c8 --- /dev/null +++ b/vendor/github.com/hashicorp/terraform/config/hcl2shim/single_attr_body.go | |||
@@ -0,0 +1,85 @@ | |||
1 | package hcl2shim | ||
2 | |||
3 | import ( | ||
4 | "fmt" | ||
5 | |||
6 | hcl2 "github.com/hashicorp/hcl2/hcl" | ||
7 | ) | ||
8 | |||
9 | // SingleAttrBody is a weird implementation of hcl2.Body that acts as if | ||
10 | // it has a single attribute whose value is the given expression. | ||
11 | // | ||
12 | // This is used to shim Resource.RawCount and Output.RawConfig to behave | ||
13 | // more like they do in the old HCL loader. | ||
14 | type SingleAttrBody struct { | ||
15 | Name string | ||
16 | Expr hcl2.Expression | ||
17 | } | ||
18 | |||
19 | var _ hcl2.Body = SingleAttrBody{} | ||
20 | |||
21 | func (b SingleAttrBody) Content(schema *hcl2.BodySchema) (*hcl2.BodyContent, hcl2.Diagnostics) { | ||
22 | content, all, diags := b.content(schema) | ||
23 | if !all { | ||
24 | // This should never happen because this body implementation should only | ||
25 | // be used by code that is aware that it's using a single-attr body. | ||
26 | diags = append(diags, &hcl2.Diagnostic{ | ||
27 | Severity: hcl2.DiagError, | ||
28 | Summary: "Invalid attribute", | ||
29 | Detail: fmt.Sprintf("The correct attribute name is %q.", b.Name), | ||
30 | Subject: b.Expr.Range().Ptr(), | ||
31 | }) | ||
32 | } | ||
33 | return content, diags | ||
34 | } | ||
35 | |||
36 | func (b SingleAttrBody) PartialContent(schema *hcl2.BodySchema) (*hcl2.BodyContent, hcl2.Body, hcl2.Diagnostics) { | ||
37 | content, all, diags := b.content(schema) | ||
38 | var remain hcl2.Body | ||
39 | if all { | ||
40 | // If the request matched the one attribute we represent, then the | ||
41 | // remaining body is empty. | ||
42 | remain = hcl2.EmptyBody() | ||
43 | } else { | ||
44 | remain = b | ||
45 | } | ||
46 | return content, remain, diags | ||
47 | } | ||
48 | |||
49 | func (b SingleAttrBody) content(schema *hcl2.BodySchema) (*hcl2.BodyContent, bool, hcl2.Diagnostics) { | ||
50 | ret := &hcl2.BodyContent{} | ||
51 | all := false | ||
52 | var diags hcl2.Diagnostics | ||
53 | |||
54 | for _, attrS := range schema.Attributes { | ||
55 | if attrS.Name == b.Name { | ||
56 | attrs, _ := b.JustAttributes() | ||
57 | ret.Attributes = attrs | ||
58 | all = true | ||
59 | } else if attrS.Required { | ||
60 | diags = append(diags, &hcl2.Diagnostic{ | ||
61 | Severity: hcl2.DiagError, | ||
62 | Summary: "Missing attribute", | ||
63 | Detail: fmt.Sprintf("The attribute %q is required.", attrS.Name), | ||
64 | Subject: b.Expr.Range().Ptr(), | ||
65 | }) | ||
66 | } | ||
67 | } | ||
68 | |||
69 | return ret, all, diags | ||
70 | } | ||
71 | |||
72 | func (b SingleAttrBody) JustAttributes() (hcl2.Attributes, hcl2.Diagnostics) { | ||
73 | return hcl2.Attributes{ | ||
74 | b.Name: { | ||
75 | Expr: b.Expr, | ||
76 | Name: b.Name, | ||
77 | NameRange: b.Expr.Range(), | ||
78 | Range: b.Expr.Range(), | ||
79 | }, | ||
80 | }, nil | ||
81 | } | ||
82 | |||
83 | func (b SingleAttrBody) MissingItemRange() hcl2.Range { | ||
84 | return b.Expr.Range() | ||
85 | } | ||