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!")
}