4
votes

I’ve created the following YAML file to provide some config which users need to provide:

Environments:
 sys1:
    models:
    - app-type: app1
      service-type: “fds"

    - app-type: app2
      service-type: “era”
 sys2:
    models:
    - app-type: app1
      service-type: “fds"

    - app-type: app2
      service-type: “era"

https://codebeautify.org/yaml-validator/cbb349ec

Here I have:

  1. one environment (root)
  2. the environment contain 1..n sys
  3. Each sys contain 1..n models instance with key app-type

Now I need to parse this YAML file so I try to build a struct type like:

type Environment struct {
    Environment [] sys
}

type sys struct{
    Models    []Properties
}

type Models struct{
    app-type     string      `yaml:"app-type"`
    service-type string      `yaml:"service-type"`
}

Now I try to parse this YAML, and I get an error of index out of range.

My questions are:

1. Do I model the YAML correctly?
2. Do I model the struct correctly?

This is the code:

func main() {
    y := Environments{}

    err := yaml.Unmarshal([]byte(data), &y)
    if err != nil {
        log.Fatalf("error: %v", err)
    }
    fmt.Printf("%+v\n", y)
}

data is the yaml.file.

1
Your Go code and YAML are both invalid, can you please post a MCVE? - Adrian
@Adrian - see the link ,the yaml is indeed valid - user4445419
The YAML at the link isn't the YAML in the question, and the Go code is still invaild. - Adrian
@Adrian - Done please re-check - user4445419
The Go code is still invalid. If you're having an issue with some code, post that code. If that code is too large to post, reduce it to the smallest possible code that reproduces the issue (i.e. a Minimal, Complete, Verifiable Example), and post that code. You may find that in doing so, you're able to resolve your own issue; and if not, then the community will have a working example with which to assist you. - Adrian

1 Answers

8
votes

Try this:

package main

import (
    "fmt"
    "log"

    "gopkg.in/yaml.v2"
)

type Message struct {
    Environments map[string]models `yaml:"Environments"`
}
type models map[string][]Model
type Model struct {
    AppType     string `yaml:"app-type"`
    ServiceType string `yaml:"service-type"`
}

func main() {
    data := []byte(`
Environments:
 sys1:
    models:
    - app-type: app1
      service-type: fds
    - app-type: app2
      service-type: era
 sys2:
    models:
    - app-type: app1
      service-type: fds
    - app-type: app2
      service-type: era
`)
    y := Message{}

    err := yaml.Unmarshal([]byte(data), &y)
    if err != nil {
        log.Fatalf("error: %v", err)
    }
    fmt.Printf("%+v\n", y)

}