From f000f3d2127afec5e40b2f87835547a83cd227d4 Mon Sep 17 00:00:00 2001 From: Andrew Pantuso Date: Mon, 7 Mar 2022 15:12:19 -0500 Subject: [PATCH 1/3] replacing tabwriter with pterm --- go.mod | 6 ++++ go.sum | 28 ++++++++++++++++++ internal/output/table.go | 61 +++++++++++++++++++++------------------- 3 files changed, 66 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index 384f89be..f317fd08 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/onsi/gomega v1.18.1 github.com/openshift-online/ocm-cli v0.1.61 github.com/openshift-online/ocm-sdk-go v0.1.241 + github.com/pterm/pterm v0.12.37 github.com/spf13/cobra v1.3.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.7.0 @@ -18,6 +19,7 @@ require ( ) require ( + github.com/atomicgo/cursor v0.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.1.2 // indirect @@ -29,6 +31,7 @@ require ( github.com/golang/glog v1.0.0 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/uuid v1.3.0 // indirect + github.com/gookit/color v1.4.2 // indirect github.com/gorilla/css v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/itchyny/gojq v0.12.5 // indirect @@ -45,6 +48,7 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/microcosm-cc/bluemonday v1.0.18 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -57,7 +61,9 @@ require ( github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.32.1 // indirect github.com/prometheus/procfs v0.7.3 // indirect + github.com/rivo/uniseg v0.2.0 // indirect github.com/stretchr/objx v0.3.0 // indirect + github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect go.uber.org/atomic v1.7.0 // indirect golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e // indirect golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect diff --git a/go.sum b/go.sum index 4e94ce45..046b489c 100644 --- a/go.sum +++ b/go.sum @@ -52,6 +52,12 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= +github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= +github.com/MarvinJWendt/testza v0.2.8/go.mod h1:nwIcjmr0Zz+Rcwfh3/4UhBp7ePKVhuBExvZqnKYWlII= +github.com/MarvinJWendt/testza v0.2.10/go.mod h1:pd+VWsoGUiFtq+hRKSU1Bktnn+DMCSrDrXDpX2bG66k= +github.com/MarvinJWendt/testza v0.2.12 h1:/PRp/BF+27t2ZxynTiqj0nyND5PbOtfJS0SuTuxmgeg= +github.com/MarvinJWendt/testza v0.2.12/go.mod h1:JOIegYyV7rX+7VZ9r77L/eH6CfJHHzXjB69adAhzZkI= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= @@ -84,6 +90,8 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/atomicgo/cursor v0.0.1 h1:xdogsqa6YYlLfM+GyClC/Lchf7aiMerFiZQn7soTOoU= +github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -314,6 +322,8 @@ github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pf github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/gookit/color v1.4.2 h1:tXy44JFSFkKnELV6WaMo/lLfu/meqITX3iAV52do7lk= +github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= @@ -476,6 +486,8 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:C github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -531,6 +543,8 @@ github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= @@ -675,7 +689,16 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= +github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg= +github.com/pterm/pterm v0.12.30/go.mod h1:MOqLIyMOgmTDz9yorcYbcw+HsgoZo3BQfg2wtl3HEFE= +github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEejaWgXU= +github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE= +github.com/pterm/pterm v0.12.37 h1:QGOyuaDUmY3yTbP0k6i0uPNqNHA9YofEBQDy0tIyKTA= +github.com/pterm/pterm v0.12.37/go.mod h1:NjiL09hFhT/vWjQHSj1athJpx6H8cjpHXNAK5bUw8T8= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -761,6 +784,8 @@ github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljT github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1030,6 +1055,7 @@ golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1038,7 +1064,9 @@ golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIj golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/internal/output/table.go b/internal/output/table.go index 5b9ea131..f07aa97a 100644 --- a/internal/output/table.go +++ b/internal/output/table.go @@ -6,10 +6,9 @@ import ( "os" "os/exec" "strings" - "text/tabwriter" -) -const tabWidth = 8 + "github.com/pterm/pterm" +) func NewTable(opts ...TableOption) (*Table, error) { var table Table @@ -17,8 +16,6 @@ func NewTable(opts ...TableOption) (*Table, error) { table.cfg.Option(opts...) table.cfg.Default() - out := table.cfg.Out - if table.cfg.PagerBin != "" { var err error @@ -27,32 +24,24 @@ func NewTable(opts ...TableOption) (*Table, error) { return nil, err } - out = table.pager + table.cfg.Out = table.pager } - table.writer = tabwriter.NewWriter(out, 0, tabWidth, 1, '\t', 0) - if !table.cfg.NoHeaders { - if err := table.writeHeaders(); err != nil { - return nil, err - } + table.writeHeaders() } return &table, nil } type Table struct { - cfg TableConfig - pager *Pager - writer *tabwriter.Writer + cfg TableConfig + data [][]string + pager *Pager } -func (t *Table) writeHeaders() error { - row := strings.Join(t.formattedHeaders(), "\t") - - _, err := t.writer.Write([]byte(row + "\t\n")) - - return err +func (t *Table) writeHeaders() { + t.data = append(t.data, t.formattedHeaders()) } func (t *Table) formattedHeaders() []string { @@ -74,15 +63,31 @@ func (t *Table) Write(r ToRower, mods ...RowModifier) error { processedRow := t.cfg.Selector(row) - _, err := t.writer.Write([]byte(processedRow.Format())) + t.data = append(t.data, processedRow.Values()) - return err + return nil } func (t *Table) Flush() error { var finalErr error - if err := t.writer.Flush(); err != nil { + printer := pterm.DefaultTable. + WithData(t.data) + + if !t.cfg.NoHeaders { + printer = printer. + WithHasHeader(). + WithHeaderStyle( + pterm.NewStyle(pterm.Bold), + ) + } + + contents, err := printer.Srender() + if err != nil { + finalErr = fmt.Errorf("rendering table: %w", finalErr) + } + + if _, err := fmt.Fprintln(t.cfg.Out, contents); err != nil { finalErr = fmt.Errorf("flusing writer: %w", finalErr) } @@ -170,16 +175,14 @@ type ToRower interface { type Row []Field -func (r Row) Format() string { - fields := make([]string, 0, len(r)) +func (r Row) Values() []string { + result := make([]string, 0, len(r)) for _, f := range r { - fields = append(fields, f.ValueString()) + result = append(result, f.ValueString()) } - res := strings.Join(fields, "\t") - - return res + "\t\n" + return result } func (r Row) GetField(name string) Field { From f092910d2003eaa6324f4a6e839d69b534d65f0f Mon Sep 17 00:00:00 2001 From: Andrew Pantuso Date: Mon, 7 Mar 2022 16:01:38 -0500 Subject: [PATCH 2/3] fix: 'notify list' usage added --- cmd/ocm-addons/notify/list/cmd.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/ocm-addons/notify/list/cmd.go b/cmd/ocm-addons/notify/list/cmd.go index 4309fa87..3d1f2238 100644 --- a/cmd/ocm-addons/notify/list/cmd.go +++ b/cmd/ocm-addons/notify/list/cmd.go @@ -26,6 +26,7 @@ type options struct { func generateCommand(opts *options, run func(*cobra.Command, []string) error) *cobra.Command { cmd := &cobra.Command{ + Use: "list", Aliases: []string{"ls"}, Short: "list available notifications", Long: "List available notifications", From af4d520d39819e57ff21cafbb473fe11865b5195 Mon Sep 17 00:00:00 2001 From: Andrew Pantuso Date: Tue, 8 Mar 2022 09:52:02 -0500 Subject: [PATCH 3/3] fix: noHeaders for custom tables --- cmd/ocm-addons/installations/cmd.go | 3 +-- cmd/ocm-addons/notify/list/cmd.go | 1 + internal/output/table.go | 32 ++++++++++++++++++----------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/cmd/ocm-addons/installations/cmd.go b/cmd/ocm-addons/installations/cmd.go index 7e9125f8..5302a0e2 100644 --- a/cmd/ocm-addons/installations/cmd.go +++ b/cmd/ocm-addons/installations/cmd.go @@ -109,13 +109,12 @@ func run(opts *options) func(cmd *cobra.Command, args []string) error { func setupTable(sess cli.Session, opts *options) (*output.Table, error) { tableOpts := []output.TableOption{ output.WithColumns(opts.Columns), + output.WithNoHeaders(opts.NoHeaders), } if pager := sess.Config().Pager(); pager != "" { tableOpts = append(tableOpts, output.WithPager(pager)) } - tableOpts = append(tableOpts, output.WithNoHeaders(opts.NoHeaders)) - return output.NewTable(tableOpts...) } diff --git a/cmd/ocm-addons/notify/list/cmd.go b/cmd/ocm-addons/notify/list/cmd.go index 3d1f2238..a6b94dca 100644 --- a/cmd/ocm-addons/notify/list/cmd.go +++ b/cmd/ocm-addons/notify/list/cmd.go @@ -53,6 +53,7 @@ func run(opts *options) func(*cobra.Command, []string) error { tableOpts := []output.TableOption{ output.WithColumns(opts.Columns), + output.WithNoHeaders(opts.NoHeaders), } if pager := sess.Config().Pager(); pager != "" { diff --git a/internal/output/table.go b/internal/output/table.go index f07aa97a..115abba3 100644 --- a/internal/output/table.go +++ b/internal/output/table.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/pterm/pterm" + "go.uber.org/multierr" ) func NewTable(opts ...TableOption) (*Table, error) { @@ -69,10 +70,23 @@ func (t *Table) Write(r ToRower, mods ...RowModifier) error { } func (t *Table) Flush() error { - var finalErr error + var errCollector error - printer := pterm.DefaultTable. - WithData(t.data) + if err := t.flush(); err != nil { + multierr.AppendInto(&errCollector, fmt.Errorf("flusing writer: %w", err)) + } + + if t.pager != nil { + if err := t.pager.Close(); err != nil { + multierr.AppendInto(&errCollector, fmt.Errorf("closing pager: %w", err)) + } + } + + return errCollector +} + +func (t *Table) flush() error { + printer := pterm.DefaultTable.WithData(t.data) if !t.cfg.NoHeaders { printer = printer. @@ -84,20 +98,14 @@ func (t *Table) Flush() error { contents, err := printer.Srender() if err != nil { - finalErr = fmt.Errorf("rendering table: %w", finalErr) + return fmt.Errorf("rendering table: %w", err) } if _, err := fmt.Fprintln(t.cfg.Out, contents); err != nil { - finalErr = fmt.Errorf("flusing writer: %w", finalErr) + return fmt.Errorf("flusing writer: %w", err) } - if t.pager != nil { - if err := t.pager.Close(); err != nil { - finalErr = fmt.Errorf("closing pager: %w", finalErr) - } - } - - return finalErr + return nil } type TableConfig struct {