HCL 解码:具有多个标签的块

我的目标是解析一个 HCL 配置(Terraform Configuration),然后将收集到的有关变量、输出、资源块和数据块的数据写入 Markdown 文件。


然而,一旦我尝试解码具有多个标签的资源块,变量和输出就没有问题。


作品:


variable "foo" {

  type = "bar"

}

不起作用:


resource "foo" "bar" {

 name = "biz"

}

错误:Extraneous label for resource; Only 1 labels (name) are expected for resource blocks. 


类型声明代码:


import (

    "log"

    "os"

    "strconv"


    "github.com/hashicorp/hcl/v2"

    "github.com/hashicorp/hcl/v2/gohcl"

    "github.com/hashicorp/hcl/v2/hclsyntax"

)


type Variable struct {

    Name        string         `hcl:",label"`

    Description string         `hcl:"description,optional"`

    Sensitive   bool           `hcl:"sensitive,optional"`

    Type        *hcl.Attribute `hcl:"type,optional"`

    Default     *hcl.Attribute `hcl:"default,optional"`

    Options     hcl.Body       `hcl:",remain"`

}


type Output struct {

    Name        string   `hcl:",label"`

    Description string   `hcl:"description,optional"`

    Sensitive   bool     `hcl:"sensitive,optional"`

    Value       string   `hcl:"value,optional"`

    Options     hcl.Body `hcl:",remain"`

}


type Resource struct {

    Name    string   `hcl:"name,label"`

    Options hcl.Body `hcl:",remain"`

}


type Data struct {

    Name    string   `hcl:"name,label"`

    Options hcl.Body `hcl:",remain"`

}


type Config struct {

    Outputs   []*Output   `hcl:"output,block"`

    Variables []*Variable `hcl:"variable,block"`

    Resources []*Resource `hcl:"resource,block"`

    Data      []*Data     `hcl:"data,block"`

}

解码代码:


func createDocs(hclPath string) map[string][]map[string]string {

    var variables, outputs []map[string]string


    parsedConfig := make(map[string][]map[string]string)

    hclConfig := make(map[string][]byte)


    c := &Config{}


    // Iterate all Terraform files and safe the contents in the hclConfig map

    for _, file := range filesInDirectory(hclPath, ".tf") {

        fileContent, err := os.ReadFile(hclPath + "/" + file.Name())

        if err != nil {

            log.Fatal(err)

        }

        hclConfig[file.Name()] = fileContent

    }


问题:如何从资源块中解析多个标签?


肥皂起泡泡
浏览 79回答 1
1回答

HUWWW

您共享的错误是由于type Resource. resourceTerraform 中的块(和data块)需要两个标签,指示资源类型和名称。要将您暗示的模式与这些结构类型相匹配,您需要定义标记为的字段label:type Resource struct {    Type    string   `hcl:"type,label"`    Name    string   `hcl:"name,label"`    Options hcl.Body `hcl:",remain"`}type Data struct {    Type    string   `hcl:"type,label"`    Name    string   `hcl:"name,label"`    Options hcl.Body `hcl:",remain"`}虽然这应该适用于您在此处显示的有限输入,但我要提醒您,您正在使用更高级别的gohclAPI,它只能解码 HCL 的一个子集,该子集很好地映射到 Go 的结构类型。hcl.BodyTerraform 本身直接使用了和的底层 API hcl.Expression,这使得 Terraform 语言可以包含一些gohclAPI 无法直接表示的 HCL 特性。根据您的目标,您可能会发现使用官方库更好terraform-config-inspect,它可以在比 HCL API 本身更高的抽象级别上解析、解码和描述 Terraform 语言的子集。它还支持为 Terraform 版本编写的模块,一直追溯到 Terraform v0.11,并且是支持Terraform Registry完成的模块分析的实现。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go