cmd: don't sort header when filter keys are specified Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
diff --git a/cmd/api.go b/cmd/api.go index 01ed2c3..022140a 100644 --- a/cmd/api.go +++ b/cmd/api.go
@@ -88,7 +88,11 @@ var filterKeys []string for _, arg := range apiArgs { if strings.HasPrefix(arg, "filter=") { - filterKeys = strings.Split(strings.Split(arg, "=")[1], ",") + for _, filterKey := range strings.Split(strings.Split(arg, "=")[1], ",") { + if len(strings.TrimSpace(filterKey)) > 0 { + filterKeys = append(filterKeys, strings.TrimSpace(filterKey)) + } + } } }
diff --git a/cmd/output.go b/cmd/output.go index 91c434d..e3815e4 100644 --- a/cmd/output.go +++ b/cmd/output.go
@@ -31,6 +31,9 @@ ) func jsonify(value interface{}) string { + if value == nil { + return "" + } if reflect.TypeOf(value).Kind() == reflect.Map || reflect.TypeOf(value).Kind() == reflect.Slice { jsonStr, err := json.Marshal(value) if err == nil { @@ -47,43 +50,6 @@ enc.Encode(response) } -func printTable(response map[string]interface{}) { - table := tablewriter.NewWriter(os.Stdout) - for k, v := range response { - valueType := reflect.TypeOf(v) - if valueType.Kind() == reflect.Slice { - items, ok := v.([]interface{}) - if !ok { - continue - } - fmt.Printf("%v:\n", k) - var header []string - for _, item := range items { - row, ok := item.(map[string]interface{}) - if !ok || len(row) < 1 { - continue - } - - if len(header) == 0 { - for field := range row { - header = append(header, field) - } - sort.Strings(header) - table.SetHeader(header) - } - var rowArray []string - for _, field := range header { - rowArray = append(rowArray, jsonify(row[field])) - } - table.Append(rowArray) - } - } else { - fmt.Printf("%v = %v\n", k, v) - } - } - table.Render() -} - func printText(response map[string]interface{}) { for k, v := range response { valueType := reflect.TypeOf(v) @@ -108,7 +74,47 @@ } } -func printColumn(response map[string]interface{}) { +func printTable(response map[string]interface{}, filter []string) { + table := tablewriter.NewWriter(os.Stdout) + for k, v := range response { + valueType := reflect.TypeOf(v) + if valueType.Kind() == reflect.Slice { + items, ok := v.([]interface{}) + if !ok { + continue + } + fmt.Printf("%v:\n", k) + var header []string + for _, item := range items { + row, ok := item.(map[string]interface{}) + if !ok || len(row) < 1 { + continue + } + if len(header) == 0 { + if len(filter) > 0 { + header = filter + } else { + for field := range row { + header = append(header, field) + } + sort.Strings(header) + } + table.SetHeader(header) + } + var rowArray []string + for _, field := range header { + rowArray = append(rowArray, jsonify(row[field])) + } + table.Append(rowArray) + } + } else { + fmt.Printf("%v = %v\n", k, v) + } + } + table.Render() +} + +func printColumn(response map[string]interface{}, filter []string) { w := tabwriter.NewWriter(os.Stdout, 0, 0, 3, ' ', tabwriter.DiscardEmptyColumns) for _, v := range response { valueType := reflect.TypeOf(v) @@ -125,10 +131,14 @@ } if idx == 0 { - for rk := range row { - header = append(header, strings.ToUpper(rk)) + if len(filter) > 0 { + header = filter + } else { + for rk := range row { + header = append(header, strings.ToUpper(rk)) + } + sort.Strings(header) } - sort.Strings(header) fmt.Fprintln(w, strings.Join(header, "\t")) } var values []string @@ -142,7 +152,7 @@ w.Flush() } -func printCsv(response map[string]interface{}) { +func printCsv(response map[string]interface{}, filter []string) { for _, v := range response { valueType := reflect.TypeOf(v) if valueType.Kind() == reflect.Slice || valueType.Kind() == reflect.Map { @@ -158,10 +168,14 @@ } if idx == 0 { - for rk := range row { - header = append(header, rk) + if len(filter) > 0 { + header = filter + } else { + for rk := range row { + header = append(header, rk) + } + sort.Strings(header) } - sort.Strings(header) fmt.Println(strings.Join(header, ",")) } var values []string @@ -170,7 +184,6 @@ } fmt.Println(strings.Join(values, ",")) } - } } } @@ -195,9 +208,6 @@ } filteredRow := make(map[string]interface{}) for _, filterKey := range filter { - if len(strings.TrimSpace(filterKey)) == 0 { - continue - } for field := range row { if filterKey == field { filteredRow[field] = row[field] @@ -226,14 +236,14 @@ switch outputType { case config.JSON: printJSON(response) - case config.TABLE: - printTable(response) case config.TEXT: printText(response) case config.COLUMN: - printColumn(response) + printColumn(response, filter) case config.CSV: - printCsv(response) + printCsv(response, filter) + case config.TABLE: + printTable(response, filter) default: fmt.Println("Invalid output type configured, please fix that!") }