@@ -15,7 +15,9 @@ import (
1515
1616// Inspector defines an interface to implement to process elements
1717type Inspector interface {
18+ // Inspect writes the raw element in JSON format.
1819 Inspect (typedElement interface {}, rawElement []byte ) error
20+ // Flush writes the result of inspecting all elements into the output stream.
1921 Flush () error
2022}
2123
@@ -38,10 +40,14 @@ func NewTemplateInspector(outputStream io.Writer, tmpl *template.Template) Inspe
3840// NewTemplateInspectorFromString creates a new TemplateInspector from a string
3941// which is compiled into a template.
4042func NewTemplateInspectorFromString (out io.Writer , tmplStr string ) (Inspector , error ) {
41- if tmplStr == "" || tmplStr == "json" {
43+ if tmplStr == "" {
4244 return NewIndentedInspector (out ), nil
4345 }
4446
47+ if tmplStr == "json" {
48+ return NewJSONInspector (out ), nil
49+ }
50+
4551 tmpl , err := templates .Parse (tmplStr )
4652 if err != nil {
4753 return nil , errors .Errorf ("Template parsing error: %s" , err )
@@ -136,64 +142,80 @@ func (i *TemplateInspector) Flush() error {
136142 return err
137143}
138144
139- // IndentedInspector uses a buffer to stop the indented representation of an element.
140- type IndentedInspector struct {
141- outputStream io.Writer
142- elements []interface {}
143- rawElements [][]byte
145+ // NewIndentedInspector generates a new inspector with an indented representation
146+ // of elements.
147+ func NewIndentedInspector (outputStream io.Writer ) Inspector {
148+ return & elementsInspector {
149+ outputStream : outputStream ,
150+ raw : func (dst * bytes.Buffer , src []byte ) error {
151+ return json .Indent (dst , src , "" , " " )
152+ },
153+ el : func (v interface {}) ([]byte , error ) {
154+ return json .MarshalIndent (v , "" , " " )
155+ },
156+ }
144157}
145158
146- // NewIndentedInspector generates a new IndentedInspector.
147- func NewIndentedInspector (outputStream io.Writer ) Inspector {
148- return & IndentedInspector {
159+ // NewJSONInspector generates a new inspector with a compact representation
160+ // of elements.
161+ func NewJSONInspector (outputStream io.Writer ) Inspector {
162+ return & elementsInspector {
149163 outputStream : outputStream ,
164+ raw : json .Compact ,
165+ el : json .Marshal ,
150166 }
151167}
152168
153- // Inspect writes the raw element with an indented json format.
154- func (i * IndentedInspector ) Inspect (typedElement interface {}, rawElement []byte ) error {
169+ type elementsInspector struct {
170+ outputStream io.Writer
171+ elements []interface {}
172+ rawElements [][]byte
173+ raw func (dst * bytes.Buffer , src []byte ) error
174+ el func (v interface {}) ([]byte , error )
175+ }
176+
177+ func (e * elementsInspector ) Inspect (typedElement interface {}, rawElement []byte ) error {
155178 if rawElement != nil {
156- i .rawElements = append (i .rawElements , rawElement )
179+ e .rawElements = append (e .rawElements , rawElement )
157180 } else {
158- i .elements = append (i .elements , typedElement )
181+ e .elements = append (e .elements , typedElement )
159182 }
160183 return nil
161184}
162185
163- // Flush writes the result of inspecting all elements into the output stream.
164- func (i * IndentedInspector ) Flush () error {
165- if len (i .elements ) == 0 && len (i .rawElements ) == 0 {
166- _ , err := io .WriteString (i .outputStream , "[]\n " )
186+ func (e * elementsInspector ) Flush () error {
187+ if len (e .elements ) == 0 && len (e .rawElements ) == 0 {
188+ _ , err := io .WriteString (e .outputStream , "[]\n " )
167189 return err
168190 }
169191
170192 var buffer io.Reader
171- if len (i .rawElements ) > 0 {
193+ if len (e .rawElements ) > 0 {
172194 bytesBuffer := new (bytes.Buffer )
173195 bytesBuffer .WriteString ("[" )
174- for idx , r := range i .rawElements {
196+ for idx , r := range e .rawElements {
175197 bytesBuffer .Write (r )
176- if idx < len (i .rawElements )- 1 {
198+ if idx < len (e .rawElements )- 1 {
177199 bytesBuffer .WriteString ("," )
178200 }
179201 }
180202 bytesBuffer .WriteString ("]" )
181- indented := new (bytes.Buffer )
182- if err := json . Indent ( indented , bytesBuffer .Bytes (), "" , " " ); err != nil {
203+ output := new (bytes.Buffer )
204+ if err := e . raw ( output , bytesBuffer .Bytes ()); err != nil {
183205 return err
184206 }
185- buffer = indented
207+ buffer = output
186208 } else {
187- b , err := json . MarshalIndent ( i .elements , "" , " " )
209+ b , err := e . el ( e .elements )
188210 if err != nil {
189211 return err
190212 }
191213 buffer = bytes .NewReader (b )
192214 }
193215
194- if _ , err := io .Copy (i .outputStream , buffer ); err != nil {
216+ if _ , err := io .Copy (e .outputStream , buffer ); err != nil {
195217 return err
196218 }
197- _ , err := io .WriteString (i .outputStream , "\n " )
219+ _ , err := io .WriteString (e .outputStream , "\n " )
198220 return err
199221}
0 commit comments