chore: expose tabwriter so InfluxDB can use it (#295)

This commit is contained in:
Sam Arnold
2021-10-06 11:27:25 -04:00
committed by GitHub
parent 25b8bddd56
commit 857e2b356c
3 changed files with 2 additions and 2 deletions

View 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"
}

View 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())
}