package main import ( "bytes" _ "embed" "encoding/json" "fmt" "os" "os/exec" "text/template" ) const statsPath = "/town/bin/stats" //go:embed blog.tmpl.html var blogTmpl string type newsEntry struct { Title string `json:"title"` // Title of entry Pubdate string `json:"pubdate"` // Human readable date Content string `json:"content"` // HTML of entry } type tildeData struct { News []newsEntry `json:"news"` // Collection of town news entries } func _main() error { data, err := stats() if err != nil { return err } t, err := template.New("blog").Parse(blogTmpl) if err != nil { return fmt.Errorf("failed to parse the blog template: %w", err) } out := bytes.Buffer{} if err = t.Execute(&out, data); err != nil { return fmt.Errorf("failed to render blog template: %w", err) } fmt.Println(out.String()) return nil } func stats() (*tildeData, error) { sout := bytes.Buffer{} cmd := exec.Command(statsPath) cmd.Stdout = &sout err := cmd.Run() if err != nil { return nil, err } data := tildeData{} err = json.Unmarshal(sout.Bytes(), &data) if err != nil { return nil, err } return &data, nil } func main() { err := _main() if err != nil { fmt.Fprintf(os.Stderr, "error: %s\n", err) os.Exit(1) } }