62 lines
1.5 KiB
Go
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
|
||
|
}
|