github.com/ungtb10d/cli/v2@v2.0.0-20221110210412-98537dd9d6a1/pkg/cmd/pr/checks/output.go (about) 1 package checks 2 3 import ( 4 "fmt" 5 "sort" 6 7 "github.com/ungtb10d/cli/v2/pkg/iostreams" 8 "github.com/ungtb10d/cli/v2/utils" 9 ) 10 11 func addRow(tp utils.TablePrinter, io *iostreams.IOStreams, o check) { 12 cs := io.ColorScheme() 13 elapsed := "" 14 15 if !o.StartedAt.IsZero() && !o.CompletedAt.IsZero() { 16 e := o.CompletedAt.Sub(o.StartedAt) 17 if e > 0 { 18 elapsed = e.String() 19 } 20 } 21 22 mark := "✓" 23 markColor := cs.Green 24 switch o.Bucket { 25 case "fail": 26 mark = "X" 27 markColor = cs.Red 28 case "pending": 29 mark = "*" 30 markColor = cs.Yellow 31 case "skipping": 32 mark = "-" 33 markColor = cs.Gray 34 } 35 36 if io.IsStdoutTTY() { 37 tp.AddField(mark, nil, markColor) 38 tp.AddField(o.Name, nil, nil) 39 tp.AddField(elapsed, nil, nil) 40 tp.AddField(o.Link, nil, nil) 41 } else { 42 tp.AddField(o.Name, nil, nil) 43 tp.AddField(o.Bucket, nil, nil) 44 if elapsed == "" { 45 tp.AddField("0", nil, nil) 46 } else { 47 tp.AddField(elapsed, nil, nil) 48 } 49 tp.AddField(o.Link, nil, nil) 50 } 51 52 tp.EndRow() 53 } 54 55 func printSummary(io *iostreams.IOStreams, counts checkCounts) { 56 summary := "" 57 if counts.Failed+counts.Passed+counts.Skipping+counts.Pending > 0 { 58 if counts.Failed > 0 { 59 summary = "Some checks were not successful" 60 } else if counts.Pending > 0 { 61 summary = "Some checks are still pending" 62 } else { 63 summary = "All checks were successful" 64 } 65 66 tallies := fmt.Sprintf("%d failing, %d successful, %d skipped, and %d pending checks", 67 counts.Failed, counts.Passed, counts.Skipping, counts.Pending) 68 69 summary = fmt.Sprintf("%s\n%s", io.ColorScheme().Bold(summary), tallies) 70 } 71 72 if io.IsStdoutTTY() { 73 fmt.Fprintln(io.Out, summary) 74 fmt.Fprintln(io.Out) 75 } 76 } 77 78 func printTable(io *iostreams.IOStreams, checks []check) error { 79 //nolint:staticcheck // SA1019: utils.NewTablePrinter is deprecated: use internal/tableprinter 80 tp := utils.NewTablePrinter(io) 81 82 sort.Slice(checks, func(i, j int) bool { 83 b0 := checks[i].Bucket 84 n0 := checks[i].Name 85 l0 := checks[i].Link 86 b1 := checks[j].Bucket 87 n1 := checks[j].Name 88 l1 := checks[j].Link 89 90 if b0 == b1 { 91 if n0 == n1 { 92 return l0 < l1 93 } 94 return n0 < n1 95 } 96 97 return (b0 == "fail") || (b0 == "pending" && b1 == "success") 98 }) 99 100 for _, o := range checks { 101 addRow(tp, io, o) 102 } 103 104 err := tp.Render() 105 if err != nil { 106 return err 107 } 108 109 return nil 110 }