2021-08-16 19:17:56 +02:00
package buffer
2022-05-02 15:05:18 +02:00
import (
"io"
)
2021-08-16 19:17:56 +02:00
// Writer implements an io.Writer over a byte slice.
type Writer struct {
2022-05-02 15:05:18 +02:00
buf [ ] byte
err error
expand bool
2021-08-16 19:17:56 +02:00
}
// NewWriter returns a new Writer for a given byte slice.
func NewWriter ( buf [ ] byte ) * Writer {
return & Writer {
2022-05-02 15:05:18 +02:00
buf : buf ,
expand : true ,
}
}
// NewStaticWriter returns a new Writer for a given byte slice. It does not reallocate and expand the byte-slice.
func NewStaticWriter ( buf [ ] byte ) * Writer {
return & Writer {
buf : buf ,
expand : false ,
2021-08-16 19:17:56 +02:00
}
}
// 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.
func ( w * Writer ) Write ( b [ ] byte ) ( int , error ) {
n := len ( b )
end := len ( w . buf )
if end + n > cap ( w . buf ) {
2022-05-02 15:05:18 +02:00
if ! w . expand {
w . err = io . EOF
return 0 , io . EOF
}
2021-08-16 19:17:56 +02:00
buf := make ( [ ] byte , end , 2 * cap ( w . buf ) + n )
copy ( buf , w . buf )
w . buf = buf
}
w . buf = w . buf [ : end + n ]
return copy ( w . buf [ end : ] , b ) , nil
}
// Len returns the length of the underlying byte slice.
func ( w * Writer ) Len ( ) int {
return len ( w . buf )
}
// Bytes returns the underlying byte slice.
func ( w * Writer ) Bytes ( ) [ ] byte {
return w . buf
}
// 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.
func ( w * Writer ) Reset ( ) {
w . buf = w . buf [ : 0 ]
}
2022-05-02 15:05:18 +02:00
// Close returns the last error.
func ( w * Writer ) Close ( ) error {
return w . err
}