package avro
import (
"encoding/binary"
"io"
"math"
)
type WriterFunc func (w *Writer )
func WithWriterConfig (cfg API ) WriterFunc {
return func (w *Writer ) {
w .cfg = cfg .(*frozenConfig )
}
}
type Writer struct {
cfg *frozenConfig
out io .Writer
buf []byte
Error error
}
func NewWriter (out io .Writer , bufSize int , opts ...WriterFunc ) *Writer {
writer := &Writer {
cfg : DefaultConfig .(*frozenConfig ),
out : out ,
buf : make ([]byte , 0 , bufSize ),
Error : nil ,
}
for _ , opt := range opts {
opt (writer )
}
return writer
}
func (w *Writer ) Reset (out io .Writer ) {
w .out = out
w .buf = w .buf [:0 ]
}
func (w *Writer ) Buffered () int {
return len (w .buf )
}
func (w *Writer ) Buffer () []byte {
return w .buf
}
func (w *Writer ) Flush () error {
if w .out == nil {
return nil
}
if w .Error != nil {
return w .Error
}
n , err := w .out .Write (w .buf )
if n < len (w .buf ) && err == nil {
err = io .ErrShortWrite
}
if err != nil {
if w .Error == nil {
w .Error = err
}
return err
}
w .buf = w .buf [:0 ]
return nil
}
func (w *Writer ) writeByte (b byte ) {
w .buf = append (w .buf , b )
}
func (w *Writer ) Write (b []byte ) (int , error ) {
w .buf = append (w .buf , b ...)
return len (b ), nil
}
func (w *Writer ) WriteBool (b bool ) {
if b {
w .writeByte (0x01 )
return
}
w .writeByte (0x00 )
}
func (w *Writer ) WriteInt (i int32 ) {
e := uint64 ((uint32 (i ) << 1 ) ^ uint32 (i >>31 ))
w .encodeInt (e )
}
func (w *Writer ) WriteLong (i int64 ) {
e := (uint64 (i ) << 1 ) ^ uint64 (i >>63 )
w .encodeInt (e )
}
func (w *Writer ) encodeInt (i uint64 ) {
if i == 0 {
w .writeByte (0 )
return
}
for i > 0 {
b := byte (i ) & 0x7F
i >>= 7
if i != 0 {
b |= 0x80
}
w .writeByte (b )
}
}
func (w *Writer ) WriteFloat (f float32 ) {
b := make ([]byte , 4 )
binary .LittleEndian .PutUint32 (b , math .Float32bits (f ))
w .buf = append (w .buf , b ...)
}
func (w *Writer ) WriteDouble (f float64 ) {
b := make ([]byte , 8 )
binary .LittleEndian .PutUint64 (b , math .Float64bits (f ))
w .buf = append (w .buf , b ...)
}
func (w *Writer ) WriteBytes (b []byte ) {
w .WriteLong (int64 (len (b )))
w .buf = append (w .buf , b ...)
}
func (w *Writer ) WriteString (s string ) {
w .WriteLong (int64 (len (s )))
w .buf = append (w .buf , s ...)
}
func (w *Writer ) WriteBlockHeader (l , s int64 ) {
if s > 0 && !w .cfg .config .DisableBlockSizeHeader {
w .WriteLong (-l )
w .WriteLong (s )
return
}
w .WriteLong (l )
}
func (w *Writer ) WriteBlockCB (callback func (w *Writer ) int64 ) int64 {
var dummyHeader [18 ]byte
headerStart := len (w .buf )
_, _ = w .Write (dummyHeader [:])
capturedAt := len (w .buf )
length := callback (w )
size := int64 (len (w .buf ) - capturedAt )
captured := w .buf [capturedAt :len (w .buf )]
w .buf = w .buf [:headerStart ]
w .WriteBlockHeader (length , size )
w .buf = append (w .buf , captured ...)
return length
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .