(rv reflect.Value, ty reflect.Type, tags *fieldTags, dst *hclwrite.Body)
| 86 | } |
| 87 | |
| 88 | func 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 |
no test coverage detected