Fix indent encoding

This commit is contained in:
Masaaki Goshima 2021-01-25 00:06:16 +09:00
parent 75f34df1c6
commit 689587cd72
4 changed files with 20 additions and 11 deletions

View File

@ -22,6 +22,7 @@ type Encoder struct {
enabledIndent bool
enabledHTMLEscape bool
unorderedMap bool
baseIndent int
prefix []byte
indentStr []byte
}
@ -156,6 +157,7 @@ func (e *Encoder) release() {
}
func (e *Encoder) reset() {
e.baseIndent = 0
e.enabledHTMLEscape = true
e.enabledIndent = false
e.unorderedMap = false
@ -298,7 +300,7 @@ func appendStructEnd(b []byte) []byte {
func (e *Encoder) appendStructEndIndent(b []byte, indent int) []byte {
b = append(b, '\n')
b = append(b, e.prefix...)
b = append(b, bytes.Repeat(e.indentStr, indent)...)
b = append(b, bytes.Repeat(e.indentStr, e.baseIndent+indent)...)
return append(b, '}', ',', '\n')
}
@ -319,5 +321,5 @@ func encodeByteSlice(b []byte, src []byte) []byte {
func (e *Encoder) encodeIndent(b []byte, indent int) []byte {
b = append(b, e.prefix...)
return append(b, bytes.Repeat(e.indentStr, indent)...)
return append(b, bytes.Repeat(e.indentStr, e.baseIndent+indent)...)
}

View File

@ -237,7 +237,7 @@ func (e *Encoder) run(ctx *encodeRuntimeContext, b []byte, codeSet *opcodeSet) (
ctx.ptrs = newPtrs
bb, err := e.runEscaped(ctx, b, ifaceCodeSet)
bb, err := e.run(ctx, b, ifaceCodeSet)
if err != nil {
return nil, err
}

View File

@ -198,10 +198,13 @@ func (e *Encoder) runEscapedIndent(ctx *encodeRuntimeContext, b []byte, codeSet
ctx.ptrs = newPtrs
bb, err := e.runEscaped(ctx, b, ifaceCodeSet)
oldBaseIndent := e.baseIndent
e.baseIndent = code.indent
bb, err := e.runEscapedIndent(ctx, b, ifaceCodeSet)
if err != nil {
return nil, err
}
e.baseIndent = oldBaseIndent
ctx.ptrs = oldPtrs
ctxptr = ctx.ptr()
@ -233,7 +236,7 @@ func (e *Encoder) runEscapedIndent(ctx *encodeRuntimeContext, b []byte, codeSet
if err := encodeWithIndent(
&buf,
bb,
string(e.prefix)+string(bytes.Repeat(e.indentStr, code.indent)),
string(e.prefix)+string(bytes.Repeat(e.indentStr, e.baseIndent+code.indent)),
string(e.indentStr),
); err != nil {
return nil, err
@ -543,9 +546,10 @@ func (e *Encoder) runEscapedIndent(ctx *encodeRuntimeContext, b []byte, codeSet
})
buf := b[pos[0]:]
buf = buf[:0]
for _, kv := range kvs {
buf = append(buf, e.prefix...)
buf = append(buf, bytes.Repeat(e.indentStr, code.indent+1)...)
buf = append(buf, bytes.Repeat(e.indentStr, e.baseIndent+code.indent+1)...)
buf = append(buf, []byte(kv.key)...)
buf[len(buf)-2] = ':'
@ -555,7 +559,7 @@ func (e *Encoder) runEscapedIndent(ctx *encodeRuntimeContext, b []byte, codeSet
buf = buf[:len(buf)-2]
buf = append(buf, '\n')
buf = append(buf, e.prefix...)
buf = append(buf, bytes.Repeat(e.indentStr, code.indent)...)
buf = append(buf, bytes.Repeat(e.indentStr, e.baseIndent+code.indent)...)
buf = append(buf, '}', ',', '\n')
b = b[:pos[0]]
b = append(b, buf...)

View File

@ -198,10 +198,13 @@ func (e *Encoder) runIndent(ctx *encodeRuntimeContext, b []byte, codeSet *opcode
ctx.ptrs = newPtrs
bb, err := e.runEscaped(ctx, b, ifaceCodeSet)
oldBaseIndent := e.baseIndent
e.baseIndent = code.indent
bb, err := e.runIndent(ctx, b, ifaceCodeSet)
if err != nil {
return nil, err
}
e.baseIndent = oldBaseIndent
ctx.ptrs = oldPtrs
ctxptr = ctx.ptr()
@ -233,7 +236,7 @@ func (e *Encoder) runIndent(ctx *encodeRuntimeContext, b []byte, codeSet *opcode
if err := encodeWithIndent(
&buf,
bb,
string(e.prefix)+string(bytes.Repeat(e.indentStr, code.indent)),
string(e.prefix)+string(bytes.Repeat(e.indentStr, e.baseIndent+code.indent)),
string(e.indentStr),
); err != nil {
return nil, err
@ -545,7 +548,7 @@ func (e *Encoder) runIndent(ctx *encodeRuntimeContext, b []byte, codeSet *opcode
buf = buf[:0]
for _, kv := range kvs {
buf = append(buf, e.prefix...)
buf = append(buf, bytes.Repeat(e.indentStr, code.indent+1)...)
buf = append(buf, bytes.Repeat(e.indentStr, e.baseIndent+code.indent+1)...)
buf = append(buf, []byte(kv.key)...)
buf[len(buf)-2] = ':'
@ -555,7 +558,7 @@ func (e *Encoder) runIndent(ctx *encodeRuntimeContext, b []byte, codeSet *opcode
buf = buf[:len(buf)-2]
buf = append(buf, '\n')
buf = append(buf, e.prefix...)
buf = append(buf, bytes.Repeat(e.indentStr, code.indent)...)
buf = append(buf, bytes.Repeat(e.indentStr, e.baseIndent+code.indent)...)
buf = append(buf, '}', ',', '\n')
b = b[:pos[0]]
b = append(b, buf...)