往Yaml中动态添加节点-Golang语言实现

package main

import (
	"fmt"
	"log"

	"gopkg.in/yaml.v3"
)

var (
	sourceYaml = `version: 1
type: verbose
kind : bfr

# my list of applications
applications:

#  First app
  - name: app1
    kind: nodejs
    path: app1
    exec:
      platforms: k8s
      builder: test
`
)

type Application struct {
	Name string `yaml:"name,omitempty" json:"name,omitempty"`
	Kind string `yaml:"kind,omitempty" json:"kind,omitempty"`
	Path string `yaml:"path,omitempty" json:"path,omitempty"`
	Exec struct {
		Platforms string `yaml:"platforms,omitempty" json:"platforms,omitempty"`
		Builder   string `yaml:"builder,omitempty" json:"builder,omitempty"`
	} `yaml:"exec,omitempty" json:"exec,omitempty"`
}

func newApplicationNode(
	name string,
	kind string,
	path string,
	platforms string,
	builder string,
	comment string) (*yaml.Node, error) {

	app := Application{
		Name: name,
		Kind: kind,
		Path: path,
		Exec: struct {
			Platforms string `yaml:"platforms,omitempty" json:"platforms,omitempty"`
			Builder   string `yaml:"builder,omitempty" json:"builder,omitempty"`
		}{platforms, builder},
	}
	marshalledApp, err := yaml.Marshal(&app)
	if err != nil {
		return nil, err
	}

	node := yaml.Node{}
	if err := yaml.Unmarshal(marshalledApp, &node); err != nil {
		return nil, err
	}
	node.Content[0].HeadComment = comment
	return &node, nil
}

func main() {
	yamlNode := yaml.Node{}

	err := yaml.Unmarshal([]byte(sourceYaml), &yamlNode)
	if err != nil {
		log.Fatalf("error: %v", err)
	}

	newApp, err := newApplicationNode("app2", "golang", "app2", "dockerh",
		"test", "Second app")
	if err != nil {
		log.Fatalf("error: %v", err)
	}

	appIdx := -1
	for i, k := range yamlNode.Content[0].Content {
		if k.Value == "applications" {
			appIdx = i + 1
			break
		}
	}

	yamlNode.Content[0].Content[appIdx].Content = append(
		yamlNode.Content[0].Content[appIdx].Content, newApp.Content[0])

	out, err := yaml.Marshal(&yamlNode)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(out))
}

猜你喜欢

转载自blog.csdn.net/SHELLCODE_8BIT/article/details/131916775
今日推荐