MCPcopy
hub / github.com/hashicorp/hcl / decodeBodyToStruct

Function decodeBodyToStruct

gohcl/decode.go:55–248  ·  view source on GitHub ↗
(body hcl.Body, ctx *hcl.EvalContext, val reflect.Value)

Source from the content-addressed store, hash-verified

53}
54
55func decodeBodyToStruct(body hcl.Body, ctx *hcl.EvalContext, val reflect.Value) hcl.Diagnostics {
56 schema, partial := ImpliedBodySchema(val.Interface())
57
58 var content *hcl.BodyContent
59 var leftovers hcl.Body
60 var diags hcl.Diagnostics
61 if partial {
62 content, leftovers, diags = body.PartialContent(schema)
63 } else {
64 content, diags = body.Content(schema)
65 }
66 if content == nil {
67 return diags
68 }
69
70 tags := getFieldTags(val.Type())
71
72 if tags.Body != nil {
73 fieldIdx := *tags.Body
74 field := val.Type().Field(fieldIdx)
75 fieldV := val.Field(fieldIdx)
76 switch {
77 case bodyType.AssignableTo(field.Type):
78 fieldV.Set(reflect.ValueOf(body))
79
80 default:
81 diags = append(diags, decodeBodyToValue(body, ctx, fieldV)...)
82 }
83 }
84
85 if tags.Remain != nil {
86 fieldIdx := *tags.Remain
87 field := val.Type().Field(fieldIdx)
88 fieldV := val.Field(fieldIdx)
89 switch {
90 case bodyType.AssignableTo(field.Type):
91 fieldV.Set(reflect.ValueOf(leftovers))
92 case attrsType.AssignableTo(field.Type):
93 attrs, attrsDiags := leftovers.JustAttributes()
94 if len(attrsDiags) > 0 {
95 diags = append(diags, attrsDiags...)
96 }
97 fieldV.Set(reflect.ValueOf(attrs))
98 default:
99 diags = append(diags, decodeBodyToValue(leftovers, ctx, fieldV)...)
100 }
101 }
102
103 for name, fieldIdx := range tags.Attributes {
104 attr := content.Attributes[name]
105 field := val.Type().Field(fieldIdx)
106 fieldV := val.Field(fieldIdx)
107
108 if attr == nil {
109 if !exprType.AssignableTo(field.Type) {
110 continue
111 }
112

Callers 1

decodeBodyToValueFunction · 0.85

Calls 15

JustAttributesMethod · 0.95
ImpliedBodySchemaFunction · 0.85
getFieldTagsFunction · 0.85
decodeBodyToValueFunction · 0.85
DecodeExpressionFunction · 0.85
decodeBlockToValueFunction · 0.85
SetMethod · 0.80
ByTypeMethod · 0.80
PtrMethod · 0.80
PartialContentMethod · 0.65
ContentMethod · 0.65
MissingItemRangeMethod · 0.65

Tested by

no test coverage detected