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