func()

in pkg/transform_new_block.go [28:92]


func (n *NewBlockTransform) Decode(block *golden.HclBlock, context *hcl.EvalContext) error {
	var err error
	n.NewBlockType, err = getRequiredStringAttribute("new_block_type", block, context)
	if err != nil {
		return err
	}
	n.FileName, err = getRequiredStringAttribute("filename", block, context)
	if err != nil {
		return err
	}
	var labels []string
	labelsAttr, ok := block.Attributes()["labels"]
	if ok {
		labelsValue, err := labelsAttr.Value(context)
		if err != nil {
			return fmt.Errorf("error while evaluating labels: %+v", err)
		}
		for i := 0; i < labelsValue.LengthInt(); i++ {
			labels = append(labels, labelsValue.Index(cty.NumberIntVal(int64(i))).AsString())
		}
	}
	n.Labels = labels
	bodyStr, err := getOptionalStringAttribute("body", block, context)
	if err != nil {
		return err
	}
	if bodyStr != nil {
		n.NewBody = *bodyStr
	}
	n.newWriteBlock = hclwrite.NewBlock(n.NewBlockType, n.Labels)
	decodeByNestedBlock := false
	for _, b := range block.NestedBlocks() {
		if b.Type == "asraw" {
			decodeByNestedBlock = true
			if err := decodeAsRawBlock(n.newWriteBlock, b); err != nil {
				return err
			}
			continue
		}
		if b.Type == "asstring" {
			decodeByNestedBlock = true
			if err = decodeAsStringBlock(n.newWriteBlock, b, 0, context); err != nil {
				return err
			}
			continue
		}
	}
	if decodeByNestedBlock && n.NewBody != "" {
		return fmt.Errorf("can only set either one of `asraw`, `asstring` or `body`")
	}
	if n.NewBody != "" {
		newBody, diag := hclwrite.ParseConfig([]byte(fmt.Sprintf(`%s %s {
%s
}`, n.NewBlockType, strings.Join(n.Labels, " "), n.NewBody)), "", hcl.InitialPos)
		if diag.HasErrors() {
			return fmt.Errorf("cannot decode body %s: %+v", n.NewBody, diag)
		}
		n.newWriteBlock = newBody.Body().Blocks()[0]
	}
	formattedBlock, err := n.Format(n.newWriteBlock)
	if err == nil {
		n.newWriteBlock = formattedBlock
	}
	return nil
}