chore: expose tabwriter so InfluxDB can use it (#295)
This commit is contained in:
68
pkg/tabwriter/tabwriter.go
Normal file
68
pkg/tabwriter/tabwriter.go
Normal file
@ -0,0 +1,68 @@
|
||||
package tabwriter
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"strings"
|
||||
"text/tabwriter"
|
||||
)
|
||||
|
||||
// TabWriter wraps tab writer headers logic.
|
||||
type TabWriter struct {
|
||||
writer *tabwriter.Writer
|
||||
headers []string
|
||||
hideHeaders bool
|
||||
}
|
||||
|
||||
// NewTabWriter creates a new tab writer.
|
||||
func NewTabWriter(w io.Writer, hideHeaders bool) *TabWriter {
|
||||
return &TabWriter{
|
||||
writer: tabwriter.NewWriter(w, 0, 8, 1, '\t', 0),
|
||||
hideHeaders: hideHeaders,
|
||||
}
|
||||
}
|
||||
|
||||
// WriteHeaders will Write headers.
|
||||
func (w *TabWriter) WriteHeaders(h ...string) error {
|
||||
w.headers = h
|
||||
if !w.hideHeaders {
|
||||
if _, err := fmt.Fprintln(w.writer, strings.Join(h, "\t")); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Write will Write the map into embed tab writer.
|
||||
func (w *TabWriter) Write(m map[string]interface{}) error {
|
||||
body := make([]interface{}, len(w.headers))
|
||||
types := make([]string, len(w.headers))
|
||||
for i, h := range w.headers {
|
||||
v := m[h]
|
||||
body[i] = v
|
||||
types[i] = formatStringType(v)
|
||||
}
|
||||
formatString := strings.Join(types, "\t")
|
||||
if _, err := fmt.Fprintf(w.writer, formatString+"\n", body...); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Flush should be called after the last call to Write to ensure
|
||||
// that any data buffered in the Writer is written to output. Any
|
||||
// incomplete escape sequence at the end is considered
|
||||
// complete for formatting purposes.
|
||||
func (w *TabWriter) Flush() error {
|
||||
return w.writer.Flush()
|
||||
}
|
||||
|
||||
func formatStringType(v interface{}) string {
|
||||
switch v.(type) {
|
||||
case int:
|
||||
return "%d"
|
||||
case string:
|
||||
return "%s"
|
||||
}
|
||||
return "%v"
|
||||
}
|
38
pkg/tabwriter/tabwriter_test.go
Normal file
38
pkg/tabwriter/tabwriter_test.go
Normal file
@ -0,0 +1,38 @@
|
||||
package tabwriter_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"testing"
|
||||
|
||||
"github.com/influxdata/influx-cli/v2/pkg/tabwriter"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func Test_WriteHeaders(t *testing.T) {
|
||||
out := bytes.Buffer{}
|
||||
w := tabwriter.NewTabWriter(&out, false)
|
||||
require.NoError(t, w.WriteHeaders("foo", "bar", "baz"))
|
||||
require.NoError(t, w.Flush())
|
||||
require.Equal(t, "foo\tbar\tbaz\n", out.String())
|
||||
}
|
||||
|
||||
func Test_WriteHeadersDisabled(t *testing.T) {
|
||||
out := bytes.Buffer{}
|
||||
w := tabwriter.NewTabWriter(&out, true)
|
||||
require.NoError(t, w.WriteHeaders("foo", "bar", "baz"))
|
||||
require.NoError(t, w.Flush())
|
||||
require.Empty(t, out.String())
|
||||
}
|
||||
|
||||
func Test_Write(t *testing.T) {
|
||||
out := bytes.Buffer{}
|
||||
w := tabwriter.NewTabWriter(&out, true)
|
||||
require.NoError(t, w.WriteHeaders("foo", "bar", "baz"))
|
||||
require.NoError(t, w.Write(map[string]interface{}{
|
||||
"bar": 123,
|
||||
"foo": "a string!",
|
||||
"baz": false,
|
||||
}))
|
||||
require.NoError(t, w.Flush())
|
||||
require.Equal(t, "a string!\t123\tfalse\n", out.String())
|
||||
}
|
Reference in New Issue
Block a user