Как кодировать комментарии при создании файла конфигурации в Go и API v3 пакета yaml - PullRequest
2 голосов
/ 22 октября 2019

Я пытаюсь научиться использовать YAML v3 при маршалинге структуры для настройки yaml.

Примечание: обновление: мой оригинальный пример был немного упрощен. Мои реальные требования ниже:

Например, у меня есть:

package main

import (
    "fmt"
    "io/ioutil"

    "gopkg.in/yaml.v3"
)

type Ec2 struct {
    Class string `yaml:"class"`
    Ip    string `yaml:"ip"`
}

type Vpc struct {
    Subnet string `yaml:"subnet"`
    Igw    interface{} `yaml:"igw"`

}

type Config struct {
    Ec2 Ec2 `yaml:"ec2"`
    Vpc Vpc `yaml:"vpc"`
}

func main() {
    c := Config{}
    bytes, err := yaml.Marshal(c)
    if err != nil {
        fmt.Println(err)
    }

    ioutil.WriteFile("config.yaml", bytes, 0644)
}

, которые создают файл с именем config.yaml file в pwd, например:

  ec2:
    class: ""
    ip: ""
  vpc:
    subnet: ""
    igw: null

Но я пытаюсь сгенерировать файл конфигурации (в данном случае config.yaml), например:


    ec2:
    # This section is for EC2
      class: ""
      ip: ""
    vpc:
    # This section is for VPC
      subnet: ""
      igw: null

Можно ли это сделать с помощью V.3?

1 Ответ

0 голосов
/ 23 октября 2019

Существует два метода использования yaml.v3 и его функция комментариев:

  • создание дерева yaml.Node вручную (утомительное обслуживание; точные обновления значений)
  • анализ aшаблон в дерево yaml.Node (простота обслуживания; сложность обновления)

Метод 1:

Создание дерева узла YAML вручную:

config = &yaml.Node{
    Kind: yaml.DocumentNode,
    Content: []*yaml.Node{
        &yaml.Node{
            Kind: yaml.MappingNode,
            Content: []*yaml.Node{
                &yaml.Node{
                    Kind:        yaml.ScalarNode,
                    Value:       "ec2",
                    HeadComment: "# This section is for EC2",
                },
                &yaml.Node{
                    Kind:  yaml.ScalarNode,
                    Style: yaml.DoubleQuotedStyle,
                    Value: "", // <- field value goes here
                },

                &yaml.Node{
                    Kind:        yaml.ScalarNode,
                    Value:       "vpc",
                    HeadComment: "# This section is for VPC",
                },
                &yaml.Node{
                    Kind:  yaml.ScalarNode,
                    Style: yaml.DoubleQuotedStyle,
                    Value: "", // <- field value goes here
                },
            },
        },
    },
}

Пример рабочей площадки: https://play.golang.org/p/Z6iw29rHZXk

Вывод:

# This section is for EC2
ec2: ""
# This section is for VPC
vpc: ""

Метод 2:

Прочитайте шаблон вашей схемы YAML, например,

var yamlSchema = []byte(`

# EC2 header-comment
ec2: ""

# This section is for VPC
vpc: ""

`)

, а затем проанализируйте его во время выполнения в дерево yaml.Node, например:

var c yaml.Node
err := yaml.Unmarshal(yamlSchema, &c)

Но как дерево yaml.Node- который имеет вложенный срез yaml.Node с - вам нужно программно найти значения полей, поэтому, когда вы настраиваете конфигурацию для записи, значения соединяются с правильными полями.

Например, это может работает сегодня:

c.Content[0].Content[1].Value = ec2Value // dangerous

, но не завтра, когда схема изменится.

Обход карты и поиск поля val* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * [тогда, когда вы можете добавить ec2 и затем поместить его значение в соседний узел. *

# This section is for EC2
ec2: ""          # <-- place user input here
# footer EC2

# This section is for VPC
vpc: ""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...