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, }) }