spoc-bot-vr/report.go

77 lines
1.4 KiB
Go

package main
import (
"context"
_ "embed"
"errors"
"io"
"text/template"
"time"
)
//go:embed report.tmpl
var reportTMPL string
func ReportSince(ctx context.Context, w io.Writer, s Storage, t time.Time) error {
tmpl := template.New("report").Funcs(map[string]any{
"time": func(foo string, args ...any) (any, error) {
switch foo {
case "Unix":
seconds, _ := args[0].(uint64)
return time.Unix(int64(seconds), 0), nil
case "Time.Format":
t, _ := args[1].(time.Time)
return t.Format(args[0].(string)), nil
}
return nil, errors.New("not impl")
},
"null": func() any {
return nil
},
"append": func(arr any, v any) (any, error) {
if v == nil {
return arr, nil
}
switch arr := arr.(type) {
case []any:
return append(arr, v), nil
case nil:
return []any{v}, nil
}
return nil, errors.New("unknown type in append")
},
})
tmpl, err := tmpl.Parse(reportTMPL)
if err != nil {
return err
}
messages, err := s.MessagesSince(ctx, t)
if err != nil {
return err
}
threads, err := s.ThreadsSince(ctx, t)
if err != nil {
return err
}
eventNames, err := s.EventNamesSince(ctx, t)
if err != nil {
return err
}
events, err := s.EventsSince(ctx, t)
if err != nil {
return err
}
return tmpl.Execute(w, map[string]any{
"since": t.Format("2006-01-02"),
"messages": messages,
"threads": threads,
"events": events,
"eventNames": eventNames,
})
}