package main import ( "bytes" "fmt" "io/ioutil" "strings" yaml "gopkg.in/yaml.v2" ) const delim = "---" type post struct { title string published bool description string tags []string coverImage string series string } func loadFile(s string) (b []byte, err error) { f, err := ioutil.ReadFile(s) if err != nil { return nil, err } return f, nil } func main() { f, err := loadFile("test.md") if err != nil { panic(err) } b := bytes.Split(f, []byte(delim)) if len(b) < 3 || len(b[0]) != 0 { panic(fmt.Errorf("Front matter is damaged")) } m := make(map[string]interface{}) err = yaml.Unmarshal([]byte(b[1]), &m) if err != nil { msg := fmt.Sprintf("error: %v\ninput:\n%s", err, b[1]) panic(msg) } p := &post{} p.title = m["title"].(string) p.published = m["published"].(bool) p.description = m["description"].(string) // TODO: Strip space after comma prior to parse? tmp := m["tags"].(string) p.tags = strings.Split(tmp, ", ") p.coverImage = m["cover_image"].(string) p.series = m["series"].(string) fmt.Printf("%#v\n", p) }