forked from TrueCloudLab/neoneo-go
5bf00db2c9
The logic here is that we'll have all binary encoding/decoding done via our io package, which simplifies error handling. This functionality doesn't belong to util, so it's moved. This also expands BufBinWriter with Reset() method to fit the needs of core package.
39 lines
1 KiB
Go
39 lines
1 KiB
Go
package io
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
)
|
|
|
|
// BufBinWriter is an additional layer on top of BinWriter that
|
|
// automatically creates buffer to write into that you can get after all
|
|
// writes via Bytes().
|
|
type BufBinWriter struct {
|
|
*BinWriter
|
|
buf *bytes.Buffer
|
|
}
|
|
|
|
// NewBufBinWriter makes a BufBinWriter with an empty byte buffer.
|
|
func NewBufBinWriter() *BufBinWriter {
|
|
b := new(bytes.Buffer)
|
|
return &BufBinWriter{BinWriter: NewBinWriterFromIO(b), buf: b}
|
|
}
|
|
|
|
// Bytes returns resulting buffer and makes future writes return an error.
|
|
func (bw *BufBinWriter) Bytes() []byte {
|
|
if bw.Err != nil {
|
|
return nil
|
|
}
|
|
bw.Err = errors.New("buffer already drained")
|
|
return bw.buf.Bytes()
|
|
}
|
|
|
|
// Reset resets the state of the buffer, making it usable again. It can
|
|
// make buffer usage somewhat more efficient, because you don't need to
|
|
// create it again, but beware that the buffer is gonna be the same as the one
|
|
// returned by Bytes(), so if you need that data after Reset() you have to copy
|
|
// it yourself.
|
|
func (bw *BufBinWriter) Reset() {
|
|
bw.Err = nil
|
|
bw.buf.Reset()
|
|
}
|