mirror of https://github.com/rancher/cli.git
125 lines
2.3 KiB
Go
125 lines
2.3 KiB
Go
package cmd
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"os"
|
|
"text/tabwriter"
|
|
|
|
"github.com/ghodss/yaml"
|
|
"github.com/urfave/cli"
|
|
)
|
|
|
|
type TableWriter struct {
|
|
HeaderFormat string
|
|
ValueFormat string
|
|
err error
|
|
headerPrinted bool
|
|
Writer *tabwriter.Writer
|
|
}
|
|
|
|
type TableWriterConfig struct {
|
|
Quiet bool
|
|
Format string
|
|
Writer io.Writer
|
|
}
|
|
|
|
func NewTableWriter(values [][]string, ctx *cli.Context) *TableWriter {
|
|
cfg := &TableWriterConfig{
|
|
Writer: os.Stdout,
|
|
Quiet: ctx.Bool("quiet"),
|
|
Format: ctx.String("format"),
|
|
}
|
|
|
|
return NewTableWriterWithConfig(values, cfg)
|
|
}
|
|
|
|
func NewTableWriterWithConfig(values [][]string, config *TableWriterConfig) *TableWriter {
|
|
writer := config.Writer
|
|
if writer == nil {
|
|
writer = os.Stdout
|
|
}
|
|
|
|
t := &TableWriter{
|
|
Writer: tabwriter.NewWriter(writer, 10, 1, 3, ' ', 0),
|
|
}
|
|
t.HeaderFormat, t.ValueFormat = SimpleFormat(values)
|
|
|
|
// remove headers if quiet or with a different format
|
|
if config.Quiet || config.Format != "" {
|
|
t.HeaderFormat = ""
|
|
}
|
|
|
|
// when quiet show only the ID
|
|
if config.Quiet {
|
|
t.ValueFormat = "{{.ID}}\n"
|
|
}
|
|
|
|
// check for custom formatting
|
|
if config.Format != "" {
|
|
customFormat := config.Format
|
|
|
|
// add a newline for other custom formats
|
|
if customFormat != "json" && customFormat != "yaml" {
|
|
customFormat += "\n"
|
|
}
|
|
t.ValueFormat = customFormat
|
|
}
|
|
|
|
return t
|
|
}
|
|
|
|
func (t *TableWriter) Err() error {
|
|
return t.err
|
|
}
|
|
|
|
func (t *TableWriter) writeHeader() {
|
|
if t.HeaderFormat != "" && !t.headerPrinted {
|
|
t.headerPrinted = true
|
|
t.err = printTemplate(t.Writer, t.HeaderFormat, struct{}{})
|
|
if t.err != nil {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func (t *TableWriter) Write(obj interface{}) {
|
|
if t.err != nil {
|
|
return
|
|
}
|
|
|
|
t.writeHeader()
|
|
if t.err != nil {
|
|
return
|
|
}
|
|
|
|
if t.ValueFormat == "json" {
|
|
content, err := json.Marshal(obj)
|
|
t.err = err
|
|
if t.err != nil {
|
|
return
|
|
}
|
|
_, t.err = t.Writer.Write(append(content, byte('\n')))
|
|
} else if t.ValueFormat == "yaml" {
|
|
content, err := yaml.Marshal(obj)
|
|
t.err = err
|
|
if t.err != nil {
|
|
return
|
|
}
|
|
_, t.err = t.Writer.Write(append(content, byte('\n')))
|
|
} else {
|
|
t.err = printTemplate(t.Writer, t.ValueFormat, obj)
|
|
}
|
|
}
|
|
|
|
func (t *TableWriter) Close() error {
|
|
if t.err != nil {
|
|
return t.err
|
|
}
|
|
t.writeHeader()
|
|
if t.err != nil {
|
|
return t.err
|
|
}
|
|
return t.Writer.Flush()
|
|
}
|