55 "fmt"
66 "io"
77 "os"
8+ "reflect"
89 "slices"
910 "strings"
1011 "text/tabwriter"
@@ -41,33 +42,86 @@ func colored(color int, text string) string {
4142 return text
4243}
4344
44- func writeSimpleOrJson (w io.Writer , content any , header []string , count int , values func (index int ) []any ) error {
45- expr := make ([][]any , 0 )
46- for i := range count {
47- expr = append (expr , values (i ))
45+ // inflateRow expands a single row into multiple rows when some cells contain slices.
46+ func inflateRow (input []any , repeat []bool ) [][]any {
47+ // Input:
48+ // a | [1, 2] | [100, 200, 300]
49+ //
50+ // Output:
51+ // a | 1 | 100
52+ // | 2 | 200
53+ // | | 300
54+ ncol := len (input )
55+ maxHeight := 1
56+ height := make ([]int , ncol )
57+ inflate := make ([]bool , ncol )
58+ for i := range ncol {
59+ if reflect .TypeOf (input [i ]).Kind () == reflect .Slice {
60+ height [i ] = reflect .ValueOf (input [i ]).Len ()
61+ maxHeight = max (maxHeight , height [i ])
62+ inflate [i ] = true
63+ }
4864 }
4965
66+ ret := make ([][]any , maxHeight )
67+ for j := range maxHeight {
68+ entry := make ([]any , ncol )
69+ for i := range ncol {
70+ switch {
71+ case repeat [i ]:
72+ fallthrough
73+ case (j == 0 ) && ! inflate [i ]:
74+ entry [i ] = input [i ]
75+ case j < height [i ]:
76+ v := reflect .ValueOf (input [i ]).Index (j ).Interface ()
77+ entry [i ] = v
78+ default :
79+ entry [i ] = ""
80+ }
81+ }
82+ ret [j ] = entry
83+ }
84+ return ret
85+ }
86+
87+ func writeSimpleOrJson (w io.Writer , content any , header []string , count int , values func (index int ) []any ) error {
88+ expr := make ([][]any , 0 )
5089 if rootOptions .output == OutputSimple {
90+ repeat := make ([]bool , len (header ))
91+ for i := range len (header ) {
92+ repeat [i ] = header [i ] == "|"
93+ }
94+
95+ for i := range count {
96+ v := values (i )
97+ entries := inflateRow (v , repeat )
98+ expr = append (expr , entries ... )
99+ }
100+
51101 header = slices .Clone (header )
52102 for j := 0 ; j < len (header ); j ++ {
53103 h := header [j ]
54104 if strings .HasSuffix (h , ":" ) {
55105 h = h [:len (h )- 1 ]
56106 header [j ] = h
57107 width := len (h )
58- for i := 0 ; i < count ; i ++ {
108+ for i := range len ( expr ) {
59109 v := fmt .Sprintf ("%v" , expr [i ][j ])
60110 width = max (width , len (v ))
61111 expr [i ][j ] = v
62112 }
63113
64114 format := fmt .Sprintf ("%%%ds" , width )
65115 header [j ] = fmt .Sprintf (format , header [j ])
66- for i := 0 ; i < count ; i ++ {
116+ for i := range len ( expr ) {
67117 expr [i ][j ] = fmt .Sprintf (format , expr [i ][j ])
68118 }
69119 }
70120 }
121+ } else {
122+ for i := range count {
123+ expr = append (expr , values (i ))
124+ }
71125 }
72126
73127 switch rootOptions .output {
@@ -89,7 +143,7 @@ func writeSimpleOrJson(w io.Writer, content any, header []string, count int, val
89143 return err
90144 }
91145 }
92- for i := range count {
146+ for i := range len ( expr ) {
93147 format := strings .Repeat ("%v\t " , len (header )- 1 ) + "%v\n "
94148 if _ , err := tw .Write ([]byte (fmt .Sprintf (format , expr [i ]... ))); err != nil {
95149 return err
0 commit comments