diff options
Diffstat (limited to 'core/payload.go')
| -rw-r--r-- | core/payload.go | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/core/payload.go b/core/payload.go new file mode 100644 index 0000000..0711040 --- /dev/null +++ b/core/payload.go @@ -0,0 +1,128 @@ +package core + +import ( + "io" + "time" +) + +type Handshake struct { + Major, Minor uint8 +} + +func (h Handshake) Wrap() (PayloadType, []any) { + return PayloadHandshake, []any{ + h.Major, h.Minor, + } +} + +func DecodeHandshake(buf io.Reader) (Handshake, error) { + var h Handshake + + err := decodeNumeric(buf, &h.Major) + if err != nil { + return h, err + } + + err = decodeNumeric(buf, &h.Minor) + if err != nil { + return h, err + } + + return h, nil +} + +type Ping struct{} + +func (p Ping) Wrap() (PayloadType, []any) { + return PayloadPing, []any{} +} + +type Pong struct { + Timestamp time.Time +} + +func (p Pong) Wrap() (PayloadType, []any) { + return PayloadPong, []any{ + p.Timestamp, + } +} + +func DecodePong(buf io.Reader) (Pong, error) { + var p Pong + err := decodeTime(buf, &p.Timestamp) + if err != nil { + return p, err + } + + return p, nil +} + +type Test struct { + Num1 uint8 + Time1 time.Time + Str1 string + Num2 uint16 + Bin1 []byte + Num3 uint32 + Str2 string + Num4 uint64 +} + +func (h Test) Wrap() (PayloadType, []any) { + return PayloadTest, []any{ + h.Num1, + h.Time1, + h.Str1, + h.Num2, + h.Bin1, + h.Num3, + h.Str2, + h.Num4, + } +} + +func DecodeTest(buf io.Reader) (Test, error) { + var t Test + + err := decodeNumeric(buf, &t.Num1) + if err != nil { + return t, err + } + + err = decodeTime(buf, &t.Time1) + if err != nil { + return t, err + } + + err = decodeString(buf, &t.Str1) + if err != nil { + return t, err + } + + err = decodeNumeric(buf, &t.Num2) + if err != nil { + return t, err + } + + err = decodeBin(buf, &t.Bin1) + if err != nil { + return t, err + } + + err = decodeNumeric(buf, &t.Num3) + if err != nil { + return t, err + } + + err = decodeString(buf, &t.Str2) + if err != nil { + return t, err + } + + err = decodeNumeric(buf, &t.Num4) + if err != nil { + return t, err + } + + return t, nil +} |
