为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
肥皂起泡泡 2022-12-13 11:13:03
我的目标是解析一个 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    }问题:如何从资源块中解析多个标签?
查看完整描述

1 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

您共享的错误是由于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完成的模块分析的实现。


查看完整回答
反对 回复 2022-12-13
  • 1 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信