go-json/internal/encoder/compact.go

57 lines
1.1 KiB
Go
Raw Permalink Normal View History

2021-03-16 18:22:19 +03:00
package encoder
import (
"bytes"
"github.com/goccy/go-json/internal/errors"
)
2021-03-18 09:53:22 +03:00
func Compact(dst *bytes.Buffer, src []byte, escape bool) error {
2021-03-16 18:22:19 +03:00
if len(src) == 0 {
return errors.ErrUnexpectedEndOfJSON("", 0)
}
length := len(src)
for cursor := 0; cursor < length; cursor++ {
c := src[cursor]
switch c {
case ' ', '\t', '\n', '\r':
continue
case '"':
if err := dst.WriteByte(c); err != nil {
return err
}
for {
cursor++
c := src[cursor]
if escape && (c == '<' || c == '>' || c == '&') {
if _, err := dst.WriteString(`\u00`); err != nil {
return err
}
if _, err := dst.Write([]byte{hex[c>>4], hex[c&0xF]}); err != nil {
return err
}
} else if err := dst.WriteByte(c); err != nil {
return err
}
switch c {
case '\\':
cursor++
if err := dst.WriteByte(src[cursor]); err != nil {
return err
}
case '"':
goto LOOP_END
case '\000':
return errors.ErrUnexpectedEndOfJSON("string", int64(length))
}
}
default:
if err := dst.WriteByte(c); err != nil {
return err
}
}
LOOP_END:
}
return nil
}