128 lines
2.1 KiB
Go
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()
|
|
}
|