Files

128 lines
2.1 KiB
Go

package protocol
import (
"bytes"
"encoding/binary"
"math"
)
type UxWriter struct {
buf bytes.Buffer
}
func NewUxWriter() *UxWriter {
return &UxWriter{}
}
func (w *UxWriter) U8(val byte) *UxWriter {
w.buf.WriteByte(val)
return w
}
func (w *UxWriter) Bool(val bool) *UxWriter {
if val {
w.buf.WriteByte(1)
} else {
w.buf.WriteByte(0)
}
return w
}
func (w *UxWriter) I16(val int16) *UxWriter {
var b [2]byte
binary.LittleEndian.PutUint16(b[:], uint16(val))
w.buf.Write(b[:])
return w
}
func (w *UxWriter) U16(val uint16) *UxWriter {
var b [2]byte
binary.LittleEndian.PutUint16(b[:], val)
w.buf.Write(b[:])
return w
}
func (w *UxWriter) I32(val int32) *UxWriter {
var b [4]byte
binary.LittleEndian.PutUint32(b[:], uint32(val))
w.buf.Write(b[:])
return w
}
func (w *UxWriter) U32(val uint32) *UxWriter {
var b [4]byte
binary.LittleEndian.PutUint32(b[:], val)
w.buf.Write(b[:])
return w
}
func (w *UxWriter) I64(val int64) *UxWriter {
var b [8]byte
binary.LittleEndian.PutUint64(b[:], uint64(val))
w.buf.Write(b[:])
return w
}
func (w *UxWriter) U64(val uint64) *UxWriter {
var b [8]byte
binary.LittleEndian.PutUint64(b[:], val)
w.buf.Write(b[:])
return w
}
func (w *UxWriter) F32(val float32) *UxWriter {
return w.U32(math.Float32bits(val))
}
func (w *UxWriter) F64(val float64) *UxWriter {
return w.U64(math.Float64bits(val))
}
func (w *UxWriter) WriteVarInt(val int) *UxWriter {
v := uint32(val)
for v >= 0x80 {
w.buf.WriteByte(byte(v | 0x80))
v >>= 7
}
w.buf.WriteByte(byte(v))
return w
}
func (w *UxWriter) Int7(val int) *UxWriter {
if val < 0 {
val = 0
}
return w.WriteVarInt(val + 1)
}
func (w *UxWriter) Raw7(val int) *UxWriter {
if val < 0 {
val = 0
}
return w.WriteVarInt(val)
}
func (w *UxWriter) UxString(str string) *UxWriter {
utf8 := []byte(str)
w.WriteVarInt(len(utf8) + 1)
w.buf.Write(utf8)
return w
}
func (w *UxWriter) UxStringNullable(str *string) *UxWriter {
if str == nil {
w.buf.WriteByte(0x00)
return w
}
return w.UxString(*str)
}
func (w *UxWriter) Raw(b []byte) *UxWriter {
w.buf.Write(b)
return w
}
func (w *UxWriter) Bytes() []byte {
return w.buf.Bytes()
}