packer-cn/hcl2template/types.build.go
Adrien Delorme 2b0e0d4eab add hcl2template pkg
Package hcl2template defines code to parse hcl2 template files correctly.

In order to configure a packer builder,provisioner,communicator and post
processor.

Checkout the files in testdata/complete/ to see what a packer config could
look like.
2019-10-15 12:56:42 +02:00

62 lines
1.5 KiB
Go

package hcl2template
import (
"github.com/hashicorp/hcl/v2"
)
const (
buildFromLabel = "from"
buildProvisionnersLabel = "provision"
buildPostProvisionnersLabel = "post_provision"
)
var buildSchema = &hcl.BodySchema{
Blocks: []hcl.BlockHeaderSchema{
{Type: buildFromLabel, LabelNames: []string{"src"}},
{Type: buildProvisionnersLabel},
{Type: buildPostProvisionnersLabel},
},
}
type Build struct {
// Ordered list of provisioner groups
ProvisionerGroups ProvisionerGroups
// Ordered list of post-provisioner groups
PostProvisionerGroups ProvisionerGroups
// Ordered list of output stanzas
Froms BuildFromList
HCL2Ref HCL2Ref
}
type Builds []*Build
func (p *Parser) decodeBuildConfig(block *hcl.Block) (*Build, hcl.Diagnostics) {
build := &Build{}
content, diags := block.Body.Content(buildSchema)
for _, block := range content.Blocks {
switch block.Type {
case buildFromLabel:
bf := BuildFrom{}
moreDiags := bf.decodeConfig(block)
diags = append(diags, moreDiags...)
build.Froms = append(build.Froms, bf)
case buildProvisionnersLabel:
pg, moreDiags := p.decodeProvisionerGroup(block, p.ProvisionersSchemas)
diags = append(diags, moreDiags...)
build.ProvisionerGroups = append(build.ProvisionerGroups, pg)
case buildPostProvisionnersLabel:
pg, moreDiags := p.decodeProvisionerGroup(block, p.PostProvisionersSchemas)
diags = append(diags, moreDiags...)
build.PostProvisionerGroups = append(build.PostProvisionerGroups, pg)
}
}
return build, diags
}