Skip to content

Commit 6393734

Browse files
committed
Updated table writer
1 parent 474fd7a commit 6393734

File tree

6 files changed

+68
-33
lines changed

6 files changed

+68
-33
lines changed

cmd/cli/flags.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ func (flags *Flags) GetString(key string) (string, error) {
7474

7575
func (flags *Flags) Write(v any) error {
7676
opts := []writer.TableOpt{}
77+
78+
// Set terminal options
79+
opts = append(opts, TerminalOpts(flags.Output())...)
80+
81+
// Set output options
7782
switch flags.GetOut() {
7883
case "text", "txt", "ascii":
7984
opts = append(opts, writer.OptText('|', true, 0))

cmd/cli/terminal.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package main
2+
3+
import (
4+
"io"
5+
"os"
6+
7+
// Packages
8+
"github.com/mutablelogic/go-client/pkg/writer"
9+
"golang.org/x/term"
10+
)
11+
12+
// TerminalOpts appends appropriate options for terminal output
13+
// including width of the terminal
14+
func TerminalOpts(w io.Writer) []writer.TableOpt {
15+
result := []writer.TableOpt{}
16+
if fh, ok := w.(*os.File); ok {
17+
if term.IsTerminal(int(fh.Fd())) {
18+
if width, _, err := term.GetSize(int(fh.Fd())); err == nil {
19+
if width > 2 {
20+
result = append(result, writer.OptTextWidth(uint(width)))
21+
}
22+
}
23+
}
24+
}
25+
return result
26+
}

pkg/writer/marshal.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package writer
22

33
import (
4-
// Packages
5-
64
"strconv"
75

6+
// Packages
87
. "github.com/djthorpe/go-errors"
98
)
109

pkg/writer/opts.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package writer
22

3+
import (
4+
. "github.com/djthorpe/go-errors"
5+
)
6+
37
///////////////////////////////////////////////////////////////////////////////
48
// TYPES
59

@@ -37,3 +41,15 @@ func OptText(delim rune, header bool, width uint) TableOpt {
3741
return nil
3842
}
3943
}
44+
45+
// Output text table format, with a delimiter, optional header and width
46+
func OptTextWidth(width uint) TableOpt {
47+
return func(m *TableMeta) error {
48+
if width > 0 && width < 3 {
49+
return ErrBadParameter.With("Invalid text width")
50+
} else {
51+
m.width = width
52+
}
53+
return nil
54+
}
55+
}

pkg/writer/table.go

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"strings"
99

1010
// Packages
11-
terminal "golang.org/x/term"
1211

1312
// Namespace imports
1413
. "github.com/djthorpe/go-errors"
@@ -18,8 +17,6 @@ import (
1817
// TYPES
1918

2019
type TableWriter struct {
21-
Width uint
22-
2320
w io.Writer
2421
}
2522

@@ -75,9 +72,6 @@ func New(w io.Writer) *TableWriter {
7572
self.w = w
7673
}
7774

78-
// Set output width
79-
self.Width = textWidth(self.w)
80-
8175
// Return success
8276
return self
8377
}
@@ -105,7 +99,6 @@ func (t *TableWriter) NewMeta(v any, opts ...TableOpt) (*TableMeta, error) {
10599
self.delim = ','
106100
self.header = true
107101
self.nilstr = nilValue
108-
self.width = t.Width
109102

110103
// Set options
111104
for _, opt := range opts {
@@ -127,7 +120,6 @@ func (t *TableWriter) NewMeta(v any, opts ...TableOpt) (*TableMeta, error) {
127120

128121
func (t *TableWriter) String() string {
129122
str := "<tablewriter"
130-
str += " width=" + fmt.Sprint(t.Width)
131123
return str + ">"
132124
}
133125

@@ -136,24 +128,13 @@ func (t *TableMeta) String() string {
136128
str += " type=" + t.Type.String()
137129
str += " columns=" + fmt.Sprint(t.Columns)
138130
str += " iterator=" + fmt.Sprint(t.Iterator)
131+
str += " width=" + fmt.Sprint(t.width)
139132
return str + ">"
140133
}
141134

142135
///////////////////////////////////////////////////////////////////////////////
143136
// PUBLIC METHODS
144137

145-
// Returns the text width of the writer
146-
func textWidth(w io.Writer) uint {
147-
if fh, ok := w.(*os.File); ok {
148-
if terminal.IsTerminal(int(fh.Fd())) {
149-
if width, _, err := terminal.GetSize(int(fh.Fd())); err == nil {
150-
return uint(width)
151-
}
152-
}
153-
}
154-
return defaultTextWidth
155-
}
156-
157138
// Returns a header for CSV output
158139
func (t *TableMeta) Header() []string {
159140
names := make([]string, len(t.Columns))

pkg/writer/writer.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -80,19 +80,27 @@ func (self *TableWriter) writeCSV(meta *TableMeta, w io.Writer) error {
8080
func (self *TableWriter) writeText(meta *TableMeta, w io.Writer) error {
8181
text := NewTextWriter(meta.Columns, meta.delim)
8282

83-
// Write header
84-
if meta.header {
85-
if err := text.Writeln(w, meta.HeaderAny()); err != nil {
86-
return err
83+
for pass := int(0); pass < 2; pass++ {
84+
// Write header
85+
if meta.header {
86+
if pass == 0 {
87+
// TODO: Adjust the column widths
88+
} else if err := text.Writeln(w, meta.HeaderAny()); err != nil {
89+
return err
90+
}
8791
}
88-
}
8992

90-
// Write rows
91-
for elems := meta.NextRow(); elems != nil; elems = meta.NextRow() {
92-
if row, err := meta.toStringAny(elems, false); err != nil {
93-
return err
94-
} else if err := text.Writeln(w, row); err != nil {
95-
return err
93+
// Write rows
94+
for elems := meta.NextRow(); elems != nil; elems = meta.NextRow() {
95+
row, err := meta.toStringAny(elems, false)
96+
if err != nil {
97+
return err
98+
}
99+
if pass == 0 {
100+
// TODO: Adjust the column widths
101+
} else if err := text.Writeln(w, row); err != nil {
102+
return err
103+
}
96104
}
97105
}
98106

0 commit comments

Comments
 (0)