|
|
package writer
import ( "bytes" "io" "sync" )
type WriterInterface interface { io.Writer
Truncate() DumpOut() DumpOutWithHeader(header string) Bytes() []byte }
type Writer struct { buffer *bytes.Buffer outWriter io.Writer lock *sync.Mutex stream bool redirector io.Writer }
func New(outWriter io.Writer) *Writer { return &Writer{ buffer: &bytes.Buffer{}, lock: &sync.Mutex{}, outWriter: outWriter, stream: true, } }
func (w *Writer) AndRedirectTo(writer io.Writer) { w.redirector = writer }
func (w *Writer) SetStream(stream bool) { w.lock.Lock() defer w.lock.Unlock() w.stream = stream }
func (w *Writer) Write(b []byte) (n int, err error) { w.lock.Lock() defer w.lock.Unlock()
n, err = w.buffer.Write(b) if w.redirector != nil { w.redirector.Write(b) } if w.stream { return w.outWriter.Write(b) } return n, err }
func (w *Writer) Truncate() { w.lock.Lock() defer w.lock.Unlock() w.buffer.Reset() }
func (w *Writer) DumpOut() { w.lock.Lock() defer w.lock.Unlock() if !w.stream { w.buffer.WriteTo(w.outWriter) } }
func (w *Writer) Bytes() []byte { w.lock.Lock() defer w.lock.Unlock() b := w.buffer.Bytes() copied := make([]byte, len(b)) copy(copied, b) return copied }
func (w *Writer) DumpOutWithHeader(header string) { w.lock.Lock() defer w.lock.Unlock() if !w.stream && w.buffer.Len() > 0 { w.outWriter.Write([]byte(header)) w.buffer.WriteTo(w.outWriter) } }
|