aboutsummaryrefslogblamecommitdiff
path: root/cmd/pr-analyzer/formatter.go
blob: a9e0f0356cb44d327ef99d0df0a03a00b204c2ba (plain) (tree)













































































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