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

Function populateBody

gohcl/encode.go:88–194  ·  view source on GitHub ↗
(rv reflect.Value, ty reflect.Type, tags *fieldTags, dst *hclwrite.Body)

Source from the content-addressed store, hash-verified

86}
87
88func populateBody(rv reflect.Value, ty reflect.Type, tags *fieldTags, dst *hclwrite.Body) {
89 nameIdxs := make(map[string]int, len(tags.Attributes)+len(tags.Blocks))
90 namesOrder := make([]string, 0, len(tags.Attributes)+len(tags.Blocks))
91 for n, i := range tags.Attributes {
92 nameIdxs[n] = i
93 namesOrder = append(namesOrder, n)
94 }
95 for n, i := range tags.Blocks {
96 nameIdxs[n] = i
97 namesOrder = append(namesOrder, n)
98 }
99 sort.SliceStable(namesOrder, func(i, j int) bool {
100 ni, nj := namesOrder[i], namesOrder[j]
101 return nameIdxs[ni] < nameIdxs[nj]
102 })
103
104 dst.Clear()
105
106 prevWasBlock := false
107 for _, name := range namesOrder {
108 fieldIdx := nameIdxs[name]
109 field := ty.Field(fieldIdx)
110 fieldTy := field.Type
111 fieldVal := rv.Field(fieldIdx)
112
113 if fieldTy.Kind() == reflect.Ptr {
114 fieldTy = fieldTy.Elem()
115 fieldVal = fieldVal.Elem()
116 }
117
118 if _, isAttr := tags.Attributes[name]; isAttr {
119
120 if exprType.AssignableTo(fieldTy) || attrType.AssignableTo(fieldTy) {
121 continue // ignore undecoded fields
122 }
123 if !fieldVal.IsValid() {
124 continue // ignore (field value is nil pointer)
125 }
126 if fieldTy.Kind() == reflect.Ptr && fieldVal.IsNil() {
127 continue // ignore
128 }
129 if prevWasBlock {
130 dst.AppendNewline()
131 prevWasBlock = false
132 }
133
134 valTy, err := gocty.ImpliedType(fieldVal.Interface())
135 if err != nil {
136 panic(fmt.Sprintf("cannot encode %T as HCL expression: %s", fieldVal.Interface(), err))
137 }
138
139 val, err := gocty.ToCtyValue(fieldVal.Interface(), valTy)
140 if err != nil {
141 // This should never happen, since we should always be able
142 // to decode into the implied type.
143 panic(fmt.Sprintf("failed to encode %T as %#v: %s", fieldVal.Interface(), valTy, err))
144 }
145

Callers 2

EncodeIntoBodyFunction · 0.85
EncodeAsBlockFunction · 0.85

Calls 6

EncodeAsBlockFunction · 0.85
AppendNewlineMethod · 0.80
SetAttributeValueMethod · 0.80
AppendBlockMethod · 0.80
ClearMethod · 0.45
LenMethod · 0.45

Tested by

no test coverage detected