package main
import (
"fmt"
"log"
"strings"
"text/tabwriter"
"time"
)
// Formatter handles the formatting of analysis results
type Formatter struct {
repo string
startDate time.Time
endDate time.Time
}
// NewFormatter creates a new output formatter
func NewFormatter(repo string, startDate, endDate time.Time) *Formatter {
return &Formatter{
repo: repo,
startDate: startDate,
endDate: endDate,
}
}
// FormatTable generates a formatted table string from the analysis results
func (f *Formatter) FormatTable(metrics []ReviewerMetrics) string {
var sb strings.Builder
w := tabwriter.NewWriter(&sb, 0, 0, 2, ' ', tabwriter.TabIndent)
_, err := fmt.Fprintf(w, "GitHub PR Review Analysis for %s (%s - %s)\n",
f.repo,
f.startDate.Format("Jan 2, 2006"),
f.endDate.Format("Jan 2, 2006"))
if err != nil {
log.Fatal(err)
}
_, err = fmt.Fprintln(w, strings.Repeat("-", 80))
if err != nil {
log.Fatal(err)
}
_, err = fmt.Fprintln(
w,
"Team Member\tPRs Reviewed\tAvg Review Speed\tAvg Comments/File\tImmediate Approvals",
)
if err != nil {
log.Fatal(err)
}
for _, m := range metrics {
_, err = fmt.Fprintf(w, "%s\t%d\t%.1f hours\t%.1f\t%.1f%%\n",
m.Username,
m.PRsReviewed,
m.AverageReviewSpeed,
m.AverageComments,
m.ImmediateApprovals)
if err != nil {
log.Fatal(err)
}
}
if err := w.Flush(); err != nil {
log.Fatal(err)
}
return sb.String()
}
// FormatError generates a formatted error message
func (f *Formatter) FormatError(err error) string {
return fmt.Sprintf("Error: %v\n", err)
}
// FormatProgress generates a formatted progress message
func (f *Formatter) FormatProgress(msg string) string {
return fmt.Sprintf("Progress: %s\n", msg)
}