mikhels
mikhels

Reputation: 33

Go YAML parsing: mandatory fields

Summary: I need to parse data in YAML format into golang struct. It there a way (library, attributes) to make some of the fields mandatory, i.e. to make Unmarshal function return the error in case if some field doesn't exist?

Example what is wanted: Unmarshal function in this code should raise an error because input data doesn't contain 'b' field.

package main

import (
    "fmt"
    "gopkg.in/yaml.v2"
)

type TestStruct struct {
    FieldA string `yaml:"a"`
    FieldB string `yaml:"b"`
}

func main() {
    input := []byte(`{a: 1}`)
    var output TestStruct

    _ = yaml.Unmarshal(input, &output)
}

Upvotes: 3

Views: 6389

Answers (2)

Phil
Phil

Reputation: 824

You can add a required flag to your struct annotations:

type TestStruct struct {
    FieldA string `yaml:"a" validate:"required"`
    FieldB string `yaml:"b" validate:"required"`
}

Upvotes: -2

sanoJ
sanoJ

Reputation: 3128

You can use this library's HasZero method to check wether there are any missing values in a struct. This will return true or false depending wether the struct is completely filled or not. Please see the playground example to get an idea.

But if you specifically need to tell what field is missing, you need to check wether the value is nil like in the example below.

package main
import (
   "fmt"
   "errors"
  "gopkg.in/yaml.v2"
)

type TestStruct struct {
  FieldA  string `yaml:"a"`
  FieldB  string `yaml:"b"`
}

func main() {
  input := []byte(`{a: 1}`)

  var output TestStruct 
  if err := output.ParseFromFile(input); err != nil {
     fmt.Println(err)
  }
  fmt.Println(output)     
}

func (output *TestStruct) ParseFromFile(data []byte) error {

  if err := yaml.Unmarshal(data, output); err != nil {
    return err
  }

  if output.FieldA == "" {
    return errors.New("Blank Field A")
  }
  if output.FieldB == "" {
    return errors.New("Blank Field B")
  }

  return nil
}

Playground example if you need to specifically return an error

Upvotes: 1

Related Questions