1package buffer
 2
 3import (
 4	"io"
 5)
 6
 7// Writer implements an io.Writer over a byte slice.
 8type Writer struct {
 9	buf    []byte
10	err    error
11	expand bool
12}
13
14// NewWriter returns a new Writer for a given byte slice.
15func NewWriter(buf []byte) *Writer {
16	return &Writer{
17		buf:    buf,
18		expand: true,
19	}
20}
21
22// NewStaticWriter returns a new Writer for a given byte slice. It does not reallocate and expand the byte-slice.
23func NewStaticWriter(buf []byte) *Writer {
24	return &Writer{
25		buf:    buf,
26		expand: false,
27	}
28}
29
30// Write writes bytes from the given byte slice and returns the number of bytes written and an error if occurred. When err != nil, n == 0.
31func (w *Writer) Write(b []byte) (int, error) {
32	n := len(b)
33	end := len(w.buf)
34	if end+n > cap(w.buf) {
35		if !w.expand {
36			w.err = io.EOF
37			return 0, io.EOF
38		}
39		buf := make([]byte, end, 2*cap(w.buf)+n)
40		copy(buf, w.buf)
41		w.buf = buf
42	}
43	w.buf = w.buf[:end+n]
44	return copy(w.buf[end:], b), nil
45}
46
47// Len returns the length of the underlying byte slice.
48func (w *Writer) Len() int {
49	return len(w.buf)
50}
51
52// Bytes returns the underlying byte slice.
53func (w *Writer) Bytes() []byte {
54	return w.buf
55}
56
57// Reset empties and reuses the current buffer. Subsequent writes will overwrite the buffer, so any reference to the underlying slice is invalidated after this call.
58func (w *Writer) Reset() {
59	w.buf = w.buf[:0]
60}
61
62// Close returns the last error.
63func (w *Writer) Close() error {
64	return w.err
65}