Skip to content

Commit

Permalink
Add table feature
Browse files Browse the repository at this point in the history
  • Loading branch information
Fatih Cetinkaya committed May 31, 2016
1 parent 77b9b4c commit 0c1f1c1
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 1 deletion.
82 changes: 81 additions & 1 deletion gocli.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
package gocli

import (
_ "errors"
"errors"
"flag"
"fmt"
"log"
Expand Down Expand Up @@ -226,3 +226,83 @@ func (cl Cli) PrintUsage() {

fmt.Println(usage)
}

// Table represent tabular data as a table
type Table struct {
data [][]string
colSizes map[int]int
}

// Data gets data
func (t *Table) Data() [][]string {
return t.data
}

// SetData sets a data by the given row, column and value
func (t *Table) SetData(row, col int, val string) error {

// Check row and column numbers
if row < 1 && col < 1 {
return errors.New("invalid row or column index")
}

// Increase the row capacity if it's necessary
if row > len(t.data) {
nt := make([][]string, row)
copy(nt, t.data)
t.data = nt
}

// Increase the column capacity if it's necessary
if col > len(t.data[row-1]) {
nr := make([]string, col)
copy(nr, t.data[row-1])
t.data[row-1] = nr
}

// Set the value
t.data[row-1][col-1] = val

// Set the column size for alignment
if t.colSizes == nil {
t.colSizes = make(map[int]int)
}

if len(val) > t.colSizes[col-1] {
t.colSizes[col-1] = len(val)
}

return nil
}

// AddRow adds a row data by the given row number and column values
func (t *Table) AddRow(row int, cols ...string) error {

// Iterate rows and set data
for i, v := range cols {
if err := t.SetData(row, i+1, v); err != nil {
return err
}
}
return nil
}

// PrintData prints data
func (t *Table) PrintData() {

if len(t.data) == 0 {
return
}

// Print data
var rowVal string
var colSize string
for _, row := range t.data {
rowVal = ""
for i, c := range row {
colSize = fmt.Sprintf("%d", t.colSizes[i])
rowVal += fmt.Sprintf("%-"+colSize+"s\t", c)
}
fmt.Println(rowVal)
}
}
54 changes: 54 additions & 0 deletions gocli_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,3 +188,57 @@ func ExampleF_PrintUsage() {
// Commands:
// cmd : Test command
}

func TestSetData(t *testing.T) {
// Create table
var table = gocli.Table{}
table.SetData(1, 1, "FOO")
table.SetData(1, 2, "BAR")
table.SetData(2, 1, "1")
table.SetData(2, 2, "2")

var tdata = table.Data()
if tdata[0][0] != "FOO" {
t.Error("invalid table data")
}
if tdata[0][1] != "BAR" {
t.Error("invalid table data")
}
if tdata[1][0] != "1" {
t.Error("invalid table data")
}
if tdata[1][1] != "2" {
t.Error("invalid table data")
}
}

func TestAddRow(t *testing.T) {
// Create table
var table = gocli.Table{}
table.AddRow(1, "FOO", "BAR")
table.AddRow(2, "1", "2")

var tdata = table.Data()
if tdata[0][0] != "FOO" {
t.Error("invalid table data")
}
if tdata[0][1] != "BAR" {
t.Error("invalid table data")
}
if tdata[1][0] != "1" {
t.Error("invalid table data")
}
if tdata[1][1] != "2" {
t.Error("invalid table data")
}
}

func ExampleF_PrintData() {
// Create table
var table = gocli.Table{}
table.AddRow(1, "FOO", "BAR")

table.PrintData()
// Output:
// FOO BAR
}

0 comments on commit 0c1f1c1

Please sign in to comment.