cmd/jobs: interpret jobs/list response as JSON

Change-Id: Idf4f4766768c6f6aa7de65156befb83c1bd259c5
Reviewed-on: https://go-review.googlesource.com/c/pkgsite-metrics/+/498555
Run-TryBot: Jonathan Amsterdam <jba@google.com>
Reviewed-by: Zvonimir Pavlinovic <zpavlinovic@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
diff --git a/cmd/jobs/main.go b/cmd/jobs/main.go
index da13d7c..638d1ab 100644
--- a/cmd/jobs/main.go
+++ b/cmd/jobs/main.go
@@ -15,6 +15,8 @@
 	"net/http"
 	"os"
 	"reflect"
+	"text/tabwriter"
+	"time"
 
 	credsapi "cloud.google.com/go/iam/credentials/apiv1"
 	credspb "cloud.google.com/go/iam/credentials/apiv1/credentialspb"
@@ -113,12 +115,21 @@
 	if err != nil {
 		return err
 	}
-	body, err := httpGet(ctx, workerURL+"/jobs/list", token)
+	joblist, err := requestJSON[[]jobs.Job](ctx, "jobs/list", token)
 	if err != nil {
 		return err
 	}
-	fmt.Printf("%s\n", body)
-	return nil
+	tw := tabwriter.NewWriter(os.Stdout, 2, 8, 1, ' ', 0)
+	fmt.Fprintf(tw, "ID\tUser\tStart Time\tStarted\tFinished\tTotal\tCanceled\n")
+	for _, j := range *joblist {
+		fmt.Fprintf(tw, "%s\t%s\t%s\t%d\t%d\t%d\t%t\n",
+			j.ID(), j.User, j.StartedAt.Format(time.RFC3339),
+			j.NumStarted,
+			j.NumSkipped+j.NumFailed+j.NumErrored+j.NumSucceeded,
+			j.NumEnqueued,
+			j.Canceled)
+	}
+	return tw.Flush()
 }
 
 func doCancel(ctx context.Context, args []string) error {