diff --git a/Makefile b/Makefile index 437f51e..25c346c 100644 --- a/Makefile +++ b/Makefile @@ -65,7 +65,7 @@ clean: rm -rf $(tool) releases coverage.out test: clean - go test -cover ./... $(OPTS) + go test -count=1 -cover ./... $(OPTS) singletest: @echo "Call like this: 'make singletest TEST=TestPrepareColumns MOD=lib'" diff --git a/lib/helpers.go b/lib/helpers.go index 8be509a..9d96997 100644 --- a/lib/helpers.go +++ b/lib/helpers.go @@ -22,7 +22,7 @@ import ( "fmt" "os" "regexp" - "sort" + "slices" "strconv" "strings" @@ -30,16 +30,6 @@ import ( "github.com/tlinden/tablizer/cfg" ) -func contains(s []int, e int) bool { - for _, a := range s { - if a == e { - return true - } - } - - return false -} - func findindex(s []int, e int) (int, bool) { for i, a := range s { if a == e { @@ -174,46 +164,31 @@ func PrepareColumnVars(columns string, data *Tabdata) ([]int, error) { // deduplicate: put all values into a map (value gets map key) // thereby removing duplicates, extract keys into new slice - // and sort it - imap := make(map[int]int, len(usecolumns)) + deduped := []int{} for _, i := range usecolumns { - imap[i] = 0 + if !slices.Contains(deduped, i) { + deduped = append(deduped, i) + } } - // fill with deduplicated columns - usecolumns = nil - - for k := range imap { - usecolumns = append(usecolumns, k) - } - - sort.Ints(usecolumns) - - return usecolumns, nil + return deduped, nil } // prepare headers: add numbers to headers func numberizeAndReduceHeaders(conf cfg.Config, data *Tabdata) { - numberedHeaders := []string{} + numberedHeaders := make([]string, len(data.headers)) + maxwidth := 0 // start from scratch, so we only look at displayed column widths + // add numbers to headers if needed, get widest cell width for idx, head := range data.headers { var headlen int - if len(conf.Columns) > 0 { - // -c specified - if !contains(conf.UseColumns, idx+1) { - // ignore this one - continue - } - } - if conf.Numbering { - numhead := fmt.Sprintf("%s(%d)", head, idx+1) - headlen = len(numhead) - numberedHeaders = append(numberedHeaders, numhead) + newhead := fmt.Sprintf("%s(%d)", head, idx+1) + numberedHeaders[idx] = newhead + headlen = len(newhead) } else { - numberedHeaders = append(numberedHeaders, head) headlen = len(head) } @@ -222,7 +197,24 @@ func numberizeAndReduceHeaders(conf cfg.Config, data *Tabdata) { } } - data.headers = numberedHeaders + if conf.Numbering { + data.headers = numberedHeaders + } + + if len(conf.UseColumns) > 0 { + // re-align headers based on user requested column list + headers := make([]string, len(conf.UseColumns)) + + for i, col := range conf.UseColumns { + for idx := range data.headers { + if col-1 == idx { + headers[i] = data.headers[col-1] + } + } + } + + data.headers = headers + } if data.maxwidthHeader != maxwidth && maxwidth > 0 { data.maxwidthHeader = maxwidth @@ -234,17 +226,17 @@ func reduceColumns(conf cfg.Config, data *Tabdata) { if len(conf.Columns) > 0 { reducedEntries := [][]string{} - var reducedEntry []string - for _, entry := range data.entries { - reducedEntry = nil + var reducedEntry []string - for i, value := range entry { - if !contains(conf.UseColumns, i+1) { - continue + for _, col := range conf.UseColumns { + col-- + + for idx, value := range entry { + if idx == col { + reducedEntry = append(reducedEntry, value) + } } - - reducedEntry = append(reducedEntry, value) } reducedEntries = append(reducedEntries, reducedEntry) diff --git a/lib/helpers_test.go b/lib/helpers_test.go index 6ce0e61..65dabdd 100644 --- a/lib/helpers_test.go +++ b/lib/helpers_test.go @@ -19,6 +19,7 @@ package lib import ( "fmt" + "slices" "testing" "github.com/stretchr/testify/assert" @@ -38,7 +39,7 @@ func TestContains(t *testing.T) { for _, tt := range tests { testname := fmt.Sprintf("contains-%d,%d,%t", tt.list, tt.search, tt.want) t.Run(testname, func(t *testing.T) { - answer := contains(tt.list, tt.search) + answer := slices.Contains(tt.list, tt.search) assert.EqualValues(t, tt.want, answer) }) @@ -72,7 +73,8 @@ func TestPrepareColumns(t *testing.T) { } for _, testdata := range tests { - testname := fmt.Sprintf("PrepareColumns-%s-%t", testdata.input, testdata.wanterror) + testname := fmt.Sprintf("PrepareColumns-%s-%t", + testdata.input, testdata.wanterror) t.Run(testname, func(t *testing.T) { conf := cfg.Config{Columns: testdata.input} err := PrepareColumns(&conf, &data)