From fb063e2955debb9d02debf3f59de291d99017058 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Thu, 18 Aug 2022 01:07:39 -0600 Subject: Add more reencode tests --- reencode.go | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'reencode.go') diff --git a/reencode.go b/reencode.go index e781c03..e7030f8 100644 --- a/reencode.go +++ b/reencode.go @@ -214,19 +214,25 @@ func (enc *ReEncoder) handleRune(c rune, t RuneType) error { } } } else { // speculating + + // conCompress is whether we're 1-up from the leaf; + // set this *before* the calls to .handleRune. + canCompress := enc.handleRuneState.specu.indentFmt.handleRuneState.specu == nil + if err := enc.handleRuneState.specu.compactFmt.handleRune(c, t); err != nil { return err } if err := enc.handleRuneState.specu.indentFmt.handleRune(c, t); err != nil { return err } + switch { case enc.handleRuneState.specu.compactBuf.Len() >= enc.CompactIfUnder: // stop speculating; use indent if _, err := enc.handleRuneState.specu.indentBuf.WriteTo(enc.Out); err != nil { return err } enc.handleRuneState = enc.handleRuneState.specu.indentFmt.handleRuneState - case t == RuneTypeObjectEnd || t == RuneTypeArrayEnd: // stop speculating; use compact + case canCompress && (t == RuneTypeObjectEnd || t == RuneTypeArrayEnd): // stop speculating; use compact if _, err := enc.handleRuneState.specu.compactBuf.WriteTo(enc.Out); err != nil { return err } @@ -311,10 +317,8 @@ func (enc *ReEncoder) handleRunePre(c rune, t RuneType) (error, bool) { case enc.Indent != "": switch t { case RuneTypeSpace: - // let us manage whitespace + // let us manage whitespace, don't pass it through return nil, false - case RuneTypeObjectBeg, RuneTypeArrayBeg: - enc.handleRuneState.curIndent++ case RuneTypeObjectEnd, RuneTypeArrayEnd: enc.handleRuneState.curIndent-- switch enc.handleRuneState.lastNonSpace { @@ -331,11 +335,14 @@ func (enc *ReEncoder) handleRunePre(c rune, t RuneType) (error, bool) { if err := enc.emitNlIndent(); err != nil { return err, false } + case RuneTypeObjectColon: + if err := enc.emitByte(' '); err != nil { + return err, false + } } - } - if enc.handleRuneState.lastNonSpace == RuneTypeObjectColon { - if err := enc.emitByte(' '); err != nil { - return err, false + switch t { + case RuneTypeObjectBeg, RuneTypeArrayBeg: + enc.handleRuneState.curIndent++ } } } -- cgit v1.2.3-2-g168b