Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Environment subcommands #89

Closed
wants to merge 14 commits into from
Prev Previous commit
Abstract table writing to xtabwriter
  • Loading branch information
cmoog committed Aug 3, 2020
commit b0e06c41981eda5f87736f198e6c103d26b44f6c
16 changes: 4 additions & 12 deletions cmd/coder/envs.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package main

import (
"encoding/json"
"fmt"
"os"

"cdr.dev/coder-cli/internal/x/xtabwriter"
Expand Down Expand Up @@ -30,17 +29,10 @@ func makeEnvsCommand() cli.Command {

switch outputFmt {
case "human":
w := xtabwriter.NewWriter()
if len(envs) > 0 {
_, err := fmt.Fprintln(w, xtabwriter.StructFieldNames(envs[0]))
requireSuccess(err, "failed to write header: %v", err)
}
for _, env := range envs {
_, err := fmt.Fprintln(w, xtabwriter.StructValues(env))
requireSuccess(err, "failed to write row: %v", err)
}
err := w.Flush()
requireSuccess(err, "failed to flush tab writer: %v", err)
err := xtabwriter.WriteTable(len(envs), func(i int) interface{} {
return envs[i]
})
requireSuccess(err, "failed to write table: %v", err)
case "json":
err := json.NewEncoder(os.Stdout).Encode(envs)
requireSuccess(err, "failed to write json: %v", err)
Expand Down
16 changes: 4 additions & 12 deletions cmd/coder/users.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package main

import (
"encoding/json"
"fmt"
"os"

"cdr.dev/coder-cli/internal/x/xtabwriter"
Expand Down Expand Up @@ -44,17 +43,10 @@ func listUsers(outputFmt *string) func(c *cli.Context) {

switch *outputFmt {
case "human":
w := xtabwriter.NewWriter()
if len(users) > 0 {
_, err = fmt.Fprintln(w, xtabwriter.StructFieldNames(users[0]))
requireSuccess(err, "failed to write: %v", err)
}
for _, u := range users {
_, err = fmt.Fprintln(w, xtabwriter.StructValues(u))
requireSuccess(err, "failed to write: %v", err)
}
err = w.Flush()
requireSuccess(err, "failed to flush writer: %v", err)
err := xtabwriter.WriteTable(len(users), func(i int) interface{} {
return users[i]
})
requireSuccess(err, "failed to write table: %v", err)
case "json":
err = json.NewEncoder(os.Stdout).Encode(users)
requireSuccess(err, "failed to encode users to json: %v", err)
Expand Down
26 changes: 26 additions & 0 deletions internal/x/xtabwriter/tabwriter.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,32 @@ func StructFieldNames(data interface{}) string {
return s.String()
}

// WriteTable writes the given list elements to stdout in a human readable
// tabular format. Headers abide by the `tab` struct tag.
//
// `tab:"-"` omits the field and no tag defaults to the Go identifier.
func WriteTable(length int, each func(i int) interface{}) error {
if length < 1 {
return nil
}
w := NewWriter()
defer w.Flush()
for ix := 0; ix < length; ix++ {
item := each(ix)
if ix == 0 {
_, err := fmt.Fprintln(w, StructFieldNames(item))
if err != nil {
return err
}
}
_, err := fmt.Fprintln(w, StructValues(item))
if err != nil {
return err
}
}
return nil
}

func shouldHideField(f reflect.StructField) bool {
return f.Tag.Get(structFieldTagKey) == "-"
}