@@ -31,6 +31,9 @@ import (
3131)
3232
3333func jsonify (value interface {}) string {
34+ if value == nil {
35+ return ""
36+ }
3437 if reflect .TypeOf (value ).Kind () == reflect .Map || reflect .TypeOf (value ).Kind () == reflect .Slice {
3538 jsonStr , err := json .Marshal (value )
3639 if err == nil {
@@ -47,7 +50,31 @@ func printJSON(response map[string]interface{}) {
4750 enc .Encode (response )
4851}
4952
50- func printTable (response map [string ]interface {}) {
53+ func printText (response map [string ]interface {}) {
54+ for k , v := range response {
55+ valueType := reflect .TypeOf (v )
56+ if valueType .Kind () == reflect .Slice {
57+ fmt .Printf ("%v:\n " , k )
58+ for idx , item := range v .([]interface {}) {
59+ if idx > 0 {
60+ fmt .Println ("================================================================================" )
61+ }
62+ row , isMap := item .(map [string ]interface {})
63+ if isMap {
64+ for field , value := range row {
65+ fmt .Printf ("%s = %v\n " , field , jsonify (value ))
66+ }
67+ } else {
68+ fmt .Printf ("%v\n " , item )
69+ }
70+ }
71+ } else {
72+ fmt .Printf ("%v = %v\n " , k , jsonify (v ))
73+ }
74+ }
75+ }
76+
77+ func printTable (response map [string ]interface {}, filter []string ) {
5178 table := tablewriter .NewWriter (os .Stdout )
5279 for k , v := range response {
5380 valueType := reflect .TypeOf (v )
@@ -63,12 +90,15 @@ func printTable(response map[string]interface{}) {
6390 if ! ok || len (row ) < 1 {
6491 continue
6592 }
66-
6793 if len (header ) == 0 {
68- for field := range row {
69- header = append (header , field )
94+ if len (filter ) > 0 {
95+ header = filter
96+ } else {
97+ for field := range row {
98+ header = append (header , field )
99+ }
100+ sort .Strings (header )
70101 }
71- sort .Strings (header )
72102 table .SetHeader (header )
73103 }
74104 var rowArray []string
@@ -84,31 +114,7 @@ func printTable(response map[string]interface{}) {
84114 table .Render ()
85115}
86116
87- func printText (response map [string ]interface {}) {
88- for k , v := range response {
89- valueType := reflect .TypeOf (v )
90- if valueType .Kind () == reflect .Slice {
91- fmt .Printf ("%v:\n " , k )
92- for idx , item := range v .([]interface {}) {
93- if idx > 0 {
94- fmt .Println ("================================================================================" )
95- }
96- row , isMap := item .(map [string ]interface {})
97- if isMap {
98- for field , value := range row {
99- fmt .Printf ("%s = %v\n " , field , jsonify (value ))
100- }
101- } else {
102- fmt .Printf ("%v\n " , item )
103- }
104- }
105- } else {
106- fmt .Printf ("%v = %v\n " , k , jsonify (v ))
107- }
108- }
109- }
110-
111- func printColumn (response map [string ]interface {}) {
117+ func printColumn (response map [string ]interface {}, filter []string ) {
112118 w := tabwriter .NewWriter (os .Stdout , 0 , 0 , 3 , ' ' , tabwriter .DiscardEmptyColumns )
113119 for _ , v := range response {
114120 valueType := reflect .TypeOf (v )
@@ -125,10 +131,14 @@ func printColumn(response map[string]interface{}) {
125131 }
126132
127133 if idx == 0 {
128- for rk := range row {
129- header = append (header , strings .ToUpper (rk ))
134+ if len (filter ) > 0 {
135+ header = filter
136+ } else {
137+ for rk := range row {
138+ header = append (header , strings .ToUpper (rk ))
139+ }
140+ sort .Strings (header )
130141 }
131- sort .Strings (header )
132142 fmt .Fprintln (w , strings .Join (header , "\t " ))
133143 }
134144 var values []string
@@ -142,7 +152,7 @@ func printColumn(response map[string]interface{}) {
142152 w .Flush ()
143153}
144154
145- func printCsv (response map [string ]interface {}) {
155+ func printCsv (response map [string ]interface {}, filter [] string ) {
146156 for _ , v := range response {
147157 valueType := reflect .TypeOf (v )
148158 if valueType .Kind () == reflect .Slice || valueType .Kind () == reflect .Map {
@@ -158,10 +168,14 @@ func printCsv(response map[string]interface{}) {
158168 }
159169
160170 if idx == 0 {
161- for rk := range row {
162- header = append (header , rk )
171+ if len (filter ) > 0 {
172+ header = filter
173+ } else {
174+ for rk := range row {
175+ header = append (header , rk )
176+ }
177+ sort .Strings (header )
163178 }
164- sort .Strings (header )
165179 fmt .Println (strings .Join (header , "," ))
166180 }
167181 var values []string
@@ -170,7 +184,6 @@ func printCsv(response map[string]interface{}) {
170184 }
171185 fmt .Println (strings .Join (values , "," ))
172186 }
173-
174187 }
175188 }
176189}
@@ -195,9 +208,6 @@ func filterResponse(response map[string]interface{}, filter []string, outputType
195208 }
196209 filteredRow := make (map [string ]interface {})
197210 for _ , filterKey := range filter {
198- if len (strings .TrimSpace (filterKey )) == 0 {
199- continue
200- }
201211 for field := range row {
202212 if filterKey == field {
203213 filteredRow [field ] = row [field ]
@@ -226,14 +236,14 @@ func printResult(outputType string, response map[string]interface{}, filter []st
226236 switch outputType {
227237 case config .JSON :
228238 printJSON (response )
229- case config .TABLE :
230- printTable (response )
231239 case config .TEXT :
232240 printText (response )
233241 case config .COLUMN :
234- printColumn (response )
242+ printColumn (response , filter )
235243 case config .CSV :
236- printCsv (response )
244+ printCsv (response , filter )
245+ case config .TABLE :
246+ printTable (response , filter )
237247 default :
238248 fmt .Println ("Invalid output type configured, please fix that!" )
239249 }
0 commit comments