(body hcl.Body, ctx *hcl.EvalContext, val reflect.Value)
| 53 | } |
| 54 | |
| 55 | func 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 |
no test coverage detected