|
@@ -7,11 +7,18 @@ import (
|
|
|
"unicode/utf8"
|
|
|
)
|
|
|
|
|
|
-type Table [][]interface{}
|
|
|
-
|
|
|
-type Options struct {
|
|
|
+type Table struct {
|
|
|
Bordered bool
|
|
|
- Header bool
|
|
|
+ Values [][]interface{}
|
|
|
+}
|
|
|
+
|
|
|
+func (table *Table) AddRow(vs ...interface{}) {
|
|
|
+ table.Values = append(table.Values, vs)
|
|
|
+}
|
|
|
+
|
|
|
+func (table *Table) WithBordered() *Table {
|
|
|
+ table.Bordered = true
|
|
|
+ return table
|
|
|
}
|
|
|
|
|
|
func printBorder(w *bytes.Buffer, ws []int) {
|
|
@@ -40,22 +47,20 @@ func calcCharsetWidth(s string) int {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func Pretty(values Table, opts *Options) []byte {
|
|
|
+func (table *Table) Marshal() ([]byte, error) {
|
|
|
columns := make([][]string, 0)
|
|
|
var widths []int
|
|
|
var width int
|
|
|
var maxLength int
|
|
|
- if opts == nil {
|
|
|
- opts = &Options{}
|
|
|
- }
|
|
|
+
|
|
|
calcWidth := calcCharsetWidth
|
|
|
- for _, value := range values {
|
|
|
+ for _, value := range table.Values {
|
|
|
if len(value) > maxLength {
|
|
|
maxLength = len(value)
|
|
|
}
|
|
|
}
|
|
|
widths = make([]int, maxLength)
|
|
|
- for _, vs := range values {
|
|
|
+ for _, vs := range table.Values {
|
|
|
vl := len(vs)
|
|
|
column := make([]string, vl)
|
|
|
for i, val := range vs {
|
|
@@ -71,20 +76,20 @@ func Pretty(values Table, opts *Options) []byte {
|
|
|
columns = append(columns, column)
|
|
|
}
|
|
|
buffer := &bytes.Buffer{}
|
|
|
- if opts.Bordered {
|
|
|
+ if table.Bordered {
|
|
|
printBorder(buffer, widths)
|
|
|
}
|
|
|
for index, column := range columns {
|
|
|
cl := len(column)
|
|
|
for i, w := range widths {
|
|
|
- if opts.Bordered {
|
|
|
+ if table.Bordered {
|
|
|
buffer.WriteString("|")
|
|
|
}
|
|
|
var str string
|
|
|
if cl > i {
|
|
|
str = column[i]
|
|
|
}
|
|
|
- if opts.Bordered {
|
|
|
+ if table.Bordered {
|
|
|
buffer.WriteString(" ")
|
|
|
}
|
|
|
buffer.WriteString(str)
|
|
@@ -94,21 +99,28 @@ func Pretty(values Table, opts *Options) []byte {
|
|
|
}
|
|
|
buffer.WriteString(" ")
|
|
|
//key value options
|
|
|
- if len(widths) == 2 && i == 0 && len(column) == 2 && !opts.Bordered && !opts.Header {
|
|
|
+ if len(widths) == 2 && i == 0 && len(column) == 2 && !table.Bordered {
|
|
|
buffer.WriteString("\t")
|
|
|
}
|
|
|
}
|
|
|
- if opts.Bordered {
|
|
|
+ if table.Bordered {
|
|
|
buffer.WriteString("|\n")
|
|
|
} else {
|
|
|
buffer.WriteString("\n")
|
|
|
}
|
|
|
- if opts.Header && index == 0 {
|
|
|
+ if table.Bordered && index == 0 {
|
|
|
printBorder(buffer, widths)
|
|
|
}
|
|
|
}
|
|
|
- if opts.Bordered {
|
|
|
+ if table.Bordered {
|
|
|
printBorder(buffer, widths)
|
|
|
}
|
|
|
- return buffer.Bytes()
|
|
|
+ return buffer.Bytes(), nil
|
|
|
+}
|
|
|
+
|
|
|
+func NewTable() *Table {
|
|
|
+ return &Table{
|
|
|
+ Bordered: false,
|
|
|
+ Values: make([][]interface{}, 0),
|
|
|
+ }
|
|
|
}
|