@@ -8,9 +8,10 @@ import (
88 . "github.com/polydawn/refmt/tok"
99)
1010
11- func NewEncoder (wr io.Writer ) * Encoder {
11+ func NewEncoder (wr io.Writer , cfg EncodeOptions ) * Encoder {
1212 return & Encoder {
1313 wr : wr ,
14+ cfg : cfg ,
1415 stack : make ([]phase , 0 , 10 ),
1516 }
1617}
@@ -25,7 +26,8 @@ func (d *Encoder) Reset() {
2526 A json.Encoder is a TokenSink implementation that emits json bytes.
2627*/
2728type Encoder struct {
28- wr io.Writer
29+ wr io.Writer
30+ cfg EncodeOptions
2931
3032 // Stack, tracking how many array and map opens are outstanding.
3133 // (Values are only 'phase_mapExpectKeyOrEnd' and 'phase_arrExpectValueOrEnd'.)
@@ -74,6 +76,10 @@ func (d *Encoder) Step(tok *Token) (done bool, err error) {
7476 case TArrOpen :
7577 return true , fmt .Errorf ("unexpected arrOpen; expected start of key or end of map" )
7678 case TMapClose :
79+ d .wr .Write (d .cfg .Line )
80+ for i := 1 ; i < len (d .stack ); i ++ {
81+ d .wr .Write (d .cfg .Indent )
82+ }
7783 d .wr .Write (wordMapClose )
7884 return d .popPhase ()
7985 case TArrClose :
@@ -126,6 +132,10 @@ func (d *Encoder) Step(tok *Token) (done bool, err error) {
126132 case TMapClose :
127133 return true , fmt .Errorf ("unexpected mapClose; expected start of value or end of array" )
128134 case TArrClose :
135+ d .wr .Write (d .cfg .Line )
136+ for i := 1 ; i < len (d .stack ); i ++ {
137+ d .wr .Write (d .cfg .Indent )
138+ }
129139 d .wr .Write (wordArrClose )
130140 return d .popPhase ()
131141 default :
@@ -149,6 +159,7 @@ func (d *Encoder) pushPhase(p phase) {
149159func (d * Encoder ) popPhase () (bool , error ) {
150160 n := len (d .stack ) - 1
151161 if n == 0 {
162+ d .wr .Write (d .cfg .Line )
152163 return true , nil
153164 }
154165 if n < 0 { // the state machines are supposed to have already errored better
@@ -167,6 +178,10 @@ func (d *Encoder) entrySep() {
167178 d .wr .Write (wordComma )
168179 }
169180 d .some = true
181+ d .wr .Write (d .cfg .Line )
182+ for i := 0 ; i < len (d .stack ); i ++ {
183+ d .wr .Write (d .cfg .Indent )
184+ }
170185}
171186
172187func (d * Encoder ) flushValue (tok * Token ) {
0 commit comments