// Copyright (C) 2022-2023 Luke Shumaker // // SPDX-License-Identifier: GPL-2.0-or-later package lowmemjson import ( "git.lukeshu.com/go/lowmemjson/internal/fastio" "git.lukeshu.com/go/lowmemjson/internal/jsonparse" "git.lukeshu.com/go/lowmemjson/internal/jsonstring" ) type reEncodeWrite struct { out fastio.AllWriter // state last jsonparse.RuneType lastNonEOF jsonparse.RuneType wasNumber bool } var _ reEncoderModule = (*reEncodeWrite)(nil) func (enc *reEncodeWrite) PopWriteBarrier() { enc.last = enc.lastNonEOF } func (enc *reEncodeWrite) HandleRune(c rune, t jsonparse.RuneType, escape BackslashEscapeMode, _ int) error { // emit newlines between top-level values, if nescessary if enc.last == jsonparse.RuneTypeEOF && enc.wasNumber && t.IsNumber() { if _, err := enc.out.WriteRune('\n'); err != nil { return err } } if t == jsonparse.RuneTypeEOF { enc.wasNumber = enc.last.IsNumber() } else { enc.lastNonEOF = t } enc.last = t // emit the rune switch t { case jsonparse.RuneTypeEOF: return nil case jsonparse.RuneTypeStringChar: return jsonstring.WriteStringChar(enc.out, c, escape) default: _, err := enc.out.WriteRune(c) return err } }