From 8b705913292937d28e37073ae1d8926da19c2380 Mon Sep 17 00:00:00 2001 From: Chandra P <4702817+chandrareddyp@users.noreply.github.com> Date: Thu, 11 Jan 2024 16:08:31 -0600 Subject: [PATCH] UX: Updated the output writer with text format (#148) --- component/output.go | 17 +++++++++++++++++ component/output_spinner.go | 4 ++-- component/output_test.go | 11 +++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/component/output.go b/component/output.go index 5d157c7a..af79dfd7 100644 --- a/component/output.go +++ b/component/output.go @@ -23,6 +23,7 @@ const ( type OutputWriter interface { SetKeys(headerKeys ...string) AddRow(items ...interface{}) + SetText(text string) Render() } @@ -38,6 +39,8 @@ const ( JSONOutputType OutputType = "json" // ListTableOutputType specified output should be in a list table format. ListTableOutputType OutputType = "listtable" + // TextOutputType specifies output should be in text format. + Text OutputType = "text" ) // outputwriter is our internal implementation. @@ -45,6 +48,7 @@ type outputwriter struct { out io.Writer keys []string values [][]interface{} + text string outputFormat OutputType autoStringifyFields bool } @@ -100,6 +104,11 @@ func (ow *outputwriter) SetKeys(headerKeys ...string) { ow.keys = headerKeys } +// SetText sets the text to be rendered. +func (ow *outputwriter) SetText(text string) { + ow.text = text +} + func stringify(items []interface{}) []interface{} { var results []interface{} for i := range items { @@ -131,6 +140,8 @@ func (ow *outputwriter) Render() { renderYAML(ow.out, ow.dataStruct()) case ListTableOutputType: renderListTable(ow) + case Text: + fmt.Fprint(ow.out, ow.text) default: renderTable(ow) } @@ -187,6 +198,12 @@ func (obw *objectwriter) AddRow(_ ...interface{}) { fmt.Fprintln(obw.out, "Programming error, attempt to add rows to object output") } +// SetText sets the text to be rendered. +func (obw *objectwriter) SetText(_ string) { + // Object writer does not have the concept of text + fmt.Fprintln(obw.out, "Programming error, attempt to add text to object output") +} + // Render emits the generated table to the output once ready func (obw *objectwriter) Render() { switch obw.outputFormat { diff --git a/component/output_spinner.go b/component/output_spinner.go index 116306d3..f31ce1b1 100644 --- a/component/output_spinner.go +++ b/component/output_spinner.go @@ -68,7 +68,7 @@ func NewOutputWriterSpinnerWithOptions(output io.Writer, outputFormat, spinnerTe func (ows *outputwriterspinner) RenderWithSpinner() { if ows.spinner != nil && ows.spinner.Active() { ows.spinner.Stop() - fmt.Fprintln(ows.out) + fmt.Fprint(ows.out) } ows.Render() } @@ -77,6 +77,6 @@ func (ows *outputwriterspinner) RenderWithSpinner() { func (ows *outputwriterspinner) StopSpinner() { if ows.spinner != nil && ows.spinner.Active() { ows.spinner.Stop() - fmt.Fprintln(ows.out) + fmt.Fprint(ows.out) } } diff --git a/component/output_test.go b/component/output_test.go index 3cccf70e..7ac03dde 100644 --- a/component/output_test.go +++ b/component/output_test.go @@ -538,6 +538,17 @@ func TestObjectWriterYAML(t *testing.T) { require.Contains(t, lines[1], "spacename: Jupiter") } +// TestNewOutputWriterText verifies that text output is rendered as-is. +func TestNewOutputWriterText(t *testing.T) { + var b bytes.Buffer + msg := "this is a test" + txt := NewOutputWriterWithOptions(&b, string(Text), nil) + require.NotNil(t, txt) + txt.SetText(msg) + txt.Render() + require.Equal(t, msg, b.String()) +} + type testStruct struct { Name string `json:"name,omitempty" yaml:"name,omitempty"` Namespace string `json:"spacename,omitempty" yaml:"spacename,omitempty"`