77 lines
1.4 KiB
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,
|
|
})
|
|
}
|