66 lines
1.5 KiB
Go
66 lines
1.5 KiB
Go
package ffjsoninception
|
|
|
|
import "strings"
|
|
|
|
// ConditionalWrite is a stack containing a number of pending writes
|
|
type ConditionalWrite struct {
|
|
Queued []string
|
|
}
|
|
|
|
// Write will add a string to be written
|
|
func (w *ConditionalWrite) Write(s string) {
|
|
w.Queued = append(w.Queued, s)
|
|
}
|
|
|
|
// DeleteLast will delete the last added write
|
|
func (w *ConditionalWrite) DeleteLast() {
|
|
if len(w.Queued) == 0 {
|
|
return
|
|
}
|
|
w.Queued = w.Queued[:len(w.Queued)-1]
|
|
}
|
|
|
|
// Last will return the last added write
|
|
func (w *ConditionalWrite) Last() string {
|
|
if len(w.Queued) == 0 {
|
|
return ""
|
|
}
|
|
return w.Queued[len(w.Queued)-1]
|
|
}
|
|
|
|
// Flush will return all queued writes, and return
|
|
// "" (empty string) in nothing has been queued
|
|
// "buf.WriteByte('" + byte + "')" + '\n' if one bute has been queued.
|
|
// "buf.WriteString(`" + string + "`)" + "\n" if more than one byte has been queued.
|
|
func (w *ConditionalWrite) Flush() string {
|
|
combined := strings.Join(w.Queued, "")
|
|
if len(combined) == 0 {
|
|
return ""
|
|
}
|
|
|
|
w.Queued = nil
|
|
if len(combined) == 1 {
|
|
return "buf.WriteByte('" + combined + "')" + "\n"
|
|
}
|
|
return "buf.WriteString(`" + combined + "`)" + "\n"
|
|
}
|
|
|
|
func (w *ConditionalWrite) FlushTo(out string) string {
|
|
out += w.Flush()
|
|
return out
|
|
}
|
|
|
|
// WriteFlush will add a string and return the Flush result for the queue
|
|
func (w *ConditionalWrite) WriteFlush(s string) string {
|
|
w.Write(s)
|
|
return w.Flush()
|
|
}
|
|
|
|
// GetQueued will return the current queued content without flushing.
|
|
func (w *ConditionalWrite) GetQueued() string {
|
|
t := w.Queued
|
|
s := w.Flush()
|
|
w.Queued = t
|
|
return s
|
|
}
|