diff options
Diffstat (limited to 'internal/table')
| -rw-r--r-- | internal/table/render.go | 21 | ||||
| -rw-r--r-- | internal/table/table.go | 100 |
2 files changed, 86 insertions, 35 deletions
diff --git a/internal/table/render.go b/internal/table/render.go index c7ed46c..55cddff 100644 --- a/internal/table/render.go +++ b/internal/table/render.go @@ -1,7 +1,6 @@ package table import ( - "fmt" "strings" ) @@ -33,26 +32,32 @@ func (r render) String() string { var sb strings.Builder sb.WriteString(r.separator) - sb.WriteString(r.rowString(r.tab.headers)) + sb.WriteString(r.rowString(r.tab.headers, r.tab.sheaderf)) sb.WriteString(r.separator) for _, row := range r.tab.rows { - sb.WriteString(r.rowString(row)) + sb.WriteString(r.rowString(row, r.tab.sprintf)) } sb.WriteString(r.separator) return sb.String() } -func (r render) rowString(row []string) string { - var sb strings.Builder +func (r render) rowString(row []string, stextf formatFunc) string { + var ( + sb strings.Builder + sbasef = r.tab.sprintf + ) for i, col := range row { - sb.WriteString(fmt.Sprintf("| %s ", col)) + sb.WriteString(sbasef("| ")) + sb.WriteString(stextf("%s", col)) + sb.WriteString(sbasef(" ")) for j := len(col); j < r.tab.lengths[i]; j++ { - sb.WriteString(" ") + sb.WriteString(sbasef(" ")) } } + sb.WriteString(sbasef("|")) - return r.tab.sprintf("%s|", sb.String()) + "\n" + return sb.String() + "\n" } diff --git a/internal/table/table.go b/internal/table/table.go index 5147b9c..48e1a00 100644 --- a/internal/table/table.go +++ b/internal/table/table.go @@ -3,25 +3,42 @@ package table import ( "fmt" "strconv" + "strings" + "github.com/buger/goterm" "github.com/fatih/color" ) type row []string +type formatFunc func(format string, args ...any) string + type Table struct { - headers []string - rows []row - lengths []int // Max length of each col - sprintf func(format string, args ...any) string // For colored output - err error + headers []string + rows []row + lengths []int // Max length of each col + sheaderf formatFunc // For colored output + sprintf formatFunc // For colored output + err error } func New() *Table { - return &Table{sprintf: fmt.Sprintf} + return &Table{ + sprintf: fmt.Sprintf, + sheaderf: fmt.Sprintf, + } } func (t *Table) WithColor(col *color.Color) *Table { + return t.WithHeaderColor(col).WithBaseColor(col) +} + +func (t *Table) WithHeaderColor(col *color.Color) *Table { + t.sheaderf = col.Sprintf + return t +} + +func (t *Table) WithBaseColor(col *color.Color) *Table { t.sprintf = col.Sprintf return t } @@ -40,24 +57,56 @@ func (t *Table) Header(args ...any) *Table { } func (t *Table) Row(args ...any) *Table { - if len(args) != len(t.headers) { - t.err = fmt.Errorf("Table row (%v) not same length as table headers (%v)", args, t.headers) + t.addRow(vals(args...)...) + return t +} + +func (t *Table) TextBox(text string) *Table { + maxLen := goterm.Width() - 4 + words := strings.Split(text, "\n") + var result []string + + for _, line := range words { + var currentLine string + for _, word := range strings.Fields(line) { + if len(currentLine)+len(word)+1 <= maxLen { + if len(currentLine) > 0 { + currentLine += " " + } + currentLine += word + } else { + if len(currentLine) > 0 { + result = append(result, currentLine) + } + currentLine = word + } + } + if len(currentLine) > 0 { + result = append(result, currentLine) + } + } + + for _, line := range result { + t.addRow(line) + } + + return t +} + +func (t *Table) addRow(row ...string) { + if len(row) != len(t.headers) { + t.err = fmt.Errorf("Table row (%v) not same length as table headers (%v)", row, t.headers) } if t.err != nil { - return t + return } - row := make(row, 0, len(args)) - for i, arg := range args { - strVal := val(arg) - row = append(row, strVal) - if t.lengths[i] < len(row[i]) { - t.lengths[i] = len(row[i]) + for i, strVal := range row { + if t.lengths[i] < len(strVal) { + t.lengths[i] = len(strVal) } } t.rows = append(t.rows, row) - - return t } func (t *Table) MustRender() { @@ -93,13 +142,10 @@ func val(val any) string { } } -// func dataRow(sb *strings.Builder, descr1 string, val1 any, descr2 string, val2 any) { -// const format = "| %-21s | %-11s | %-21s | %-11s |" -// sb.WriteString(colour.SInfo2f(format, descr1, val(val1), descr2, val(val2))) -// sb.WriteString("\n") -// } - -// func (t *Table) separator() { -// t.sb.WriteString(t.sep) -// t.sb.WriteString("\n") -// } +func vals(vals ...any) []string { + strVals := make([]string, 0, len(vals)) + for _, v := range vals { + strVals = append(strVals, val(v)) + } + return strVals +} |
