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() }