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