]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/json: add (*Encoder).Indent
authorCaleb Spare <cespare@gmail.com>
Thu, 24 Mar 2016 06:14:35 +0000 (23:14 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 25 Mar 2016 03:56:47 +0000 (03:56 +0000)
Fixes #6492.

Change-Id: Ibc633c43a6d134bb140addb59780a5758b35a5c5
Reviewed-on: https://go-review.googlesource.com/21057
Run-TryBot: Caleb Spare <cespare@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/encoding/json/stream.go
src/encoding/json/stream_test.go

index f5612692b8519868d0e6318d93aa4ae6553b3f66..b740d32a7dda7dad2ebbe59972b59de5b7fac206 100644 (file)
@@ -168,6 +168,10 @@ func nonSpace(b []byte) bool {
 type Encoder struct {
        w   io.Writer
        err error
+
+       indentBuf    *bytes.Buffer
+       indentPrefix string
+       indentValue  string
 }
 
 // NewEncoder returns a new encoder that writes to w.
@@ -198,13 +202,29 @@ func (enc *Encoder) Encode(v interface{}) error {
        // digits coming.
        e.WriteByte('\n')
 
-       if _, err = enc.w.Write(e.Bytes()); err != nil {
+       b := e.Bytes()
+       if enc.indentBuf != nil {
+               enc.indentBuf.Reset()
+               err = Indent(enc.indentBuf, b, enc.indentPrefix, enc.indentValue)
+               if err != nil {
+                       return err
+               }
+               b = enc.indentBuf.Bytes()
+       }
+       if _, err = enc.w.Write(b); err != nil {
                enc.err = err
        }
        encodeStatePool.Put(e)
        return err
 }
 
+// Indent sets the encoder to format each encoded object with Indent.
+func (enc *Encoder) Indent(prefix, indent string) {
+       enc.indentBuf = new(bytes.Buffer)
+       enc.indentPrefix = prefix
+       enc.indentValue = indent
+}
+
 // RawMessage is a raw encoded JSON object.
 // It implements Marshaler and Unmarshaler and can
 // be used to delay JSON decoding or precompute a JSON encoding.
index cca644eb416845c32280b36455fe63a06d34948e..db25708f4cd3833c82a7ca8229f7303ba5d34c3a 100644 (file)
@@ -57,6 +57,36 @@ func TestEncoder(t *testing.T) {
        }
 }
 
+var streamEncodedIndent = `0.1
+"hello"
+null
+true
+false
+[
+>."a",
+>."b",
+>."c"
+>]
+{
+>."ß": "long s",
+>."K": "Kelvin"
+>}
+3.14
+`
+
+func TestEncoderIndent(t *testing.T) {
+       var buf bytes.Buffer
+       enc := NewEncoder(&buf)
+       enc.Indent(">", ".")
+       for _, v := range streamTest {
+               enc.Encode(v)
+       }
+       if have, want := buf.String(), streamEncodedIndent; have != want {
+               t.Error("indented encoding mismatch")
+               diff(t, []byte(have), []byte(want))
+       }
+}
+
 func TestDecoder(t *testing.T) {
        for i := 0; i <= len(streamTest); i++ {
                // Use stream without newlines as input,