Skip to content

Instantly share code, notes, and snippets.

@sajayantony
Last active August 14, 2018 02:10
Show Gist options
  • Save sajayantony/1fcb7063ef54081b58b56c78fd52a8a2 to your computer and use it in GitHub Desktop.
Save sajayantony/1fcb7063ef54081b58b56c78fd52a8a2 to your computer and use it in GitHub Desktop.
YAML always as string
package main
import (
"fmt"
"log"
"strings"
"gopkg.in/yaml.v2"
)
var data = `
steps:
- cmd: "hello-world"
- cmd: bash -c "echo hello-world >> something"
- cmd:
- "test"
- "image"
`
// StringArray for yaml unmarshalling
type StringArray []string
// Cmd - Command struct
type Cmd struct {
Cmd StringArray
}
// Task - holder of steps
type Task struct {
Steps []Cmd `yaml:",flow"`
}
//UnmarshalYAML interface implementation
func (a *StringArray) UnmarshalYAML(unmarshal func(interface{}) error) error {
var multi []string
err := unmarshal(&multi)
if err != nil {
var single string
err := unmarshal(&single)
if err != nil {
return err
}
*a = []string{single}
} else {
*a = multi
}
return nil
}
func main() {
t := Task{}
err := yaml.Unmarshal([]byte(data), &t)
if err != nil {
log.Fatalf("error: %v", err)
}
fmt.Printf("--- t:\n%v\n\n", t)
d, err := yaml.Marshal(&t)
if err != nil {
log.Fatalf("error: %v", err)
}
fmt.Printf("--- t dump:\n%s\n\n", string(d))
m := make(map[interface{}]interface{})
err = yaml.Unmarshal([]byte(data), &m)
if err != nil {
log.Fatalf("error: %v", err)
}
fmt.Printf("--- m:\n%v\n\n", m)
d, err = yaml.Marshal(&m)
if err != nil {
log.Fatalf("error: %v", err)
}
fmt.Printf("--- m dump:\n%s\n\n", string(d))
for _, s := range t.Steps {
fmt.Printf("Value: %s\n", strings.Join(s.Cmd, ","))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment