返回顶部
首页 > 资讯 > 后端开发 > GO >HCL 解码:具有多个标签的块
  • 217
分享到

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

2024-04-04 23:04:31 217人浏览 独家记忆
摘要

学习知识要善于思考,思考,再思考!今天编程网小编就给大家带来《HCL 解码:具有多个标签的块》,以下内容主要包含等知识点,如果你正在学习或准备学习golang,就都不要错过本文啦~让我们一起来看看吧

学习知识要善于思考,思考,再思考!今天编程网小编就给大家带来《HCL 解码:具有多个标签的块》,以下内容主要包含等知识点,如果你正在学习或准备学习golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

我的目标是解析 hcl 配置(terrafORM configuration),然后将收集到的有关变量、输出、资源块和数据块的数据写入 markdown 文件中。

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

作品:

variable "foo" {
  type = "bar"
}

不起作用:

resource "foo" "bar" {
 name = "biz"
}

错误:资源的额外标签;资源块仅需要 1 个标签(名称)。

类型声明代码:

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
    }

    // Iterate all file contents
    for k, v := range hclConfig {
        parsedConfig, diags := hclsyntax.ParseConfig(v, k, hcl.Pos{Line: 1, Column: 1})
        if diags.HasErrors() {
            log.Fatal(diags)
        }

        diags = gohcl.DecodeBody(parsedConfig.Body, nil, c)
        if diags.HasErrors() {
            log.Fatal(diags)
        }
    }

    for _, v := range c.Variables {
        var variableType string
        var variableDefault string

        if v.Type != nil {
            variableType = (v.Type.Expr).Variables()[0].RootName()
        }

        if v.Default != nil {
            variableDefault = (v.Default.Expr).Variables()[0].RootName()
        }

        variables = append(variables, map[string]string{"name": v.Name, "description": v.Description,
            "sensitive": strconv.FormatBool(v.Sensitive), "type": variableType, "default": variableDefault})
    }

    for _, v := range c.Outputs {
        outputs = append(outputs, map[string]string{"name": v.Name, "description": v.Description,
            "sensitive": strconv.FormatBool(v.Sensitive), "value": v.Value})
    }

    parsedConfig["variables"], parsedConfig["outputs"] = variables, outputs

    return parsedConfig
}

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


正确答案


您分享的错误是由于 type resource 的定义造成的。 terraform 中的 resource 块(和 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"`
}

虽然这应该适用于您在此处显示的有限输入,但我想提醒您正在使用更高级别的 gohcl api,它只能解码 hcl 的子集,该子集很好地映射到 go 的结构类型。 terraform本身直接使用了hcl.Bodyhcl.Expression的低级api,这使得terraform语言可以包含一些gohcl api无法直接表示的hcl功能。

根据您的目标,您可能会发现使用官方库 terraform-config-inspect 更好,它可以在比 hcl api 本身更高的抽象级别上解析、解码和描述 terraform 语言的子集。它还支持为 terraform 版本编写的模块,一直追溯到 terraform v0.11,并且是支持 Terraform ReGIStry 完成的模块分析的实现。

理论要掌握,实操不能落!以上关于《HCL 解码:具有多个标签的块》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注编程网公众号吧!

您可能感兴趣的文档:

--结束END--

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

本文链接: https://lsjlt.com/news/596103.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • HCL 解码:具有多个标签的块
    学习知识要善于思考,思考,再思考!今天编程网小编就给大家带来《HCL 解码:具有多个标签的块》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧...
    99+
    2024-04-04
  • Golang多个字段具有相同的json标签名称
    欢迎各位小伙伴来到编程网,相聚于此都是缘哈哈哈!今天我给大家带来《Golang多个字段具有相同的json标签名称》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都...
    99+
    2024-04-04
  • 具有多个路径的 Go 模块
    php小编子墨介绍:最近,Go语言中的模块管理工具又迎来了新的功能——多路径模块。这一功能的引入,使得开发者在使用Go模块时可以更加灵活地指定模块的路径。以往,开发者只能将模块安装在固...
    99+
    2024-02-10
    go语言
  • html伪元素有多少个标签
    HTML伪元素是一种特殊的CSS选择器,用于在元素的内容之前或之后插入样式化的内容。它们不是真正的HTML标签,而是在CSS中使用的。HTML伪元素主要有以下几种:::before伪元素:在元素内容的前面插入样式化的内容。它通常用于在元素前...
    99+
    2023-10-21
    html 伪元素
  • dedecms织梦TAG标签显示单个标签共有多少篇文章的方法
    我们在进行织梦dedecms模板设计的时候,想实现tag的链接和tag名的同时,还能显示每个tag关联的文章的数量。 但是织梦默认没有这样的标签来调用,这就需要我们自己对系统文件进行修改来实现了,具体方法如下: 找到并打...
    99+
    2022-06-12
    dedecms TAG标签 显示
  • 同时调用具有不同签名的多个函数
    学习知识要善于思考,思考,再思考!今天编程网小编就给大家带来《同时调用具有不同签名的多个函数》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧...
    99+
    2024-04-05
  • 为网站代码块pre标签增加一个复制代码按钮代码
    参考其他比较专业的博客系统,都在代码块上有一个复制代码的按钮。用来快速复制整个代码块的代码。于是我也想给我的博客增加一个这个功能。 注:chrome测试通过。其他浏览器未进行测试。 ...
    99+
    2024-04-02
  • 具有不同结构标签集的 Golang Unmarshal
    php小编百草今天为大家介绍一种强大的Golang特性——具有不同结构标签集的Unmarshal。在Golang编程中,Unmarshal是一种将数据转换为结构体的过程。但是,当我们的...
    99+
    2024-02-10
  • css中常见的块元素标签有哪些
    css中常见的块元素标签有:address、blockquote、dir、div、dl、form、hr、ol、p、pre、table、ul、caption、dd、fieldset、li、legend、noframes、noscript、h1...
    99+
    2024-04-02
  • 怎么为网站代码块pre标签增加一个复制代码按钮代码
    怎么为网站代码块pre标签增加一个复制代码按钮代码,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。参考其他比较专业的博客系统,都在代码块上有一个的按钮。用来快速复制整个代码块...
    99+
    2023-06-25
  • 将具有多个程序的 GOPATH 存储库转换为 GO 模块
    Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《将具有多个程序的 GOPATH 存储库转换为 GO 模块》带大家来了解一下##cont...
    99+
    2024-04-04
  • 如何编写具有不同签名的同一方法的多个实现
    从现在开始,我们要努力学习啦!今天我给大家带来《如何编写具有不同签名的同一方法的多个实现》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方...
    99+
    2024-04-04
  • 怎么在Ubuntu15.04的终端中开启多个标签
    这篇文章主要介绍“怎么在Ubuntu15.04的终端中开启多个标签”,在日常操作中,相信很多人在怎么在Ubuntu15.04的终端中开启多个标签问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在Ubuntu...
    99+
    2023-06-16
  • 以多tab标签方式打开windows CMD的工具是什么
    以多tab标签方式打开windows CMD的工具是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。最近我在做基于nodejs的微服务开发,需要在windows命令行里启...
    99+
    2023-06-04
  • 框架标签的语法精髓:理解 HTML 构建块
    框架标签是 HTML 中用于定义页面布局和内容划分的强大工具。它们允许您将页面分割成不同的区域,每个区域都可以容纳不同的内容或应用程序。理解框架标签的语法至关重要,因为它可以帮助您创建结构化良好的页面,并为用户提供良好的体验。 语法: ...
    99+
    2024-02-29
    HTML 框架标签 语法 子框架 嵌套
  • vue只有一个根标签的原因是什么
    今天小编给大家分享一下vue只有一个根标签的原因是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了...
    99+
    2024-04-02
  • 破解 noscript 标签的代码:定制脚本执行
    1. 确定 noscript 标签的位置 Noscript 标签通常放置在 HTML 文档的 <head> 部分。它通常包含一个禁用脚本执行的 <noscript> 元素。 <noscript> 元素内...
    99+
    2024-04-02
  • Java 多线程的同步代码块详解
    目录synchronized同步代码块同步方法(this锁)静态同步方法死锁问题lock总结火车站抢票问题 由于现实中买票也不会是零延迟的,为了真实性加入了延迟机制,也就是线程休眠语...
    99+
    2024-04-02
  • 标签的语言:解读 HTML 文本格式的代码
    HTML 标签:文本格式的语言 HTML(超文本标记语言)标签是构成网页基础的语言。它们使用尖括号 <> 和描述性文本组成,用于定义文本的格式、结构和外观。 HTML 标签的结构 每个 HTML 标签由两个尖括号组成:一个用...
    99+
    2024-03-04
    HTML 标签、文本格式、尖括号、代码
  • HTML 框架标签:嵌入多媒体内容的有效方法
    iframe 标签 <iframe> 标签允许在一个网页内嵌入另一个网页。这对于在不离开当前页面或创建新窗口的情况下显示外部内容非常有用。例如,可以将 <iframe> 用于: 在页面上显示视频播放器 加载社交媒...
    99+
    2024-03-13
    框架标签
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作