Может кто-нибудь помочь разобрать HCL?

Я собираюсь проанализировать файл конфигурации HCL, используя этот репозиторий.

package main

import (
    "fmt"
    hclParser "github.com/hashicorp/hcl/hcl/parser"
)

const (
    EXAMPLE_CONFIG_STRING = "log_dir = \"/var/log\""
)

func main() {
    // parse HCL configuration
    if astFile, err := hclParser.Parse([]byte(EXAMPLE_CONFIG_STRING)); err == nil {
        fmt.Println(astFile)
    } else {
        fmt.Println("Parsing failed.")
    }
}

Как я могу разобрать log_dir в этом случае?

1 ответ

Решение

github.com/hashicorp/hcl/hcl/parser - это пакет низкого уровня. Используйте высокоуровневый API вместо:

package main

import (
        "fmt"

        "github.com/hashicorp/hcl"
)

type T struct {
        LogDir string `hcl:"log_dir"`
}

func main() {
        var t T
        err := hcl.Decode(&t, `log_dir = "/var/log"`)
        fmt.Println(t.LogDir, err)
}

Также доступен DecodeObject, если вы действительно хотите разобраться с AST самостоятельно.

Может ли помочь мне найти проблему в следующем примере?

type cfg_dict struct {
      name     string       `hcl:",key"`
      type     string       `hcl:"type"`
}

type hcl_config struct {
      config_items    cfg_dict      `hcl:"config"`
}

func main() {
    hcl_example = `config "cfg1" {
           type = "string"
    }`

    hcl_opts := &hcl_config{}

    hcl_tree, err := hcl.Parse(hcl_example)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    if err := hcl.DecodeObject(&hcl_opts, hcl_tree); err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    fmt.Println(hcl_opts)
}

Когда я попытался запустить этот тестовый код после сборки, он показывает пустое значение.

&{[]}
Другие вопросы по тегам