summaryrefslogtreecommitdiffstats
path: root/core/payload.go
blob: 07110403dc9638fab5cd62291af9d262c423bb87 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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
}