diff options
Diffstat (limited to 'core/data.go')
| -rw-r--r-- | core/data.go | 76 |
1 files changed, 43 insertions, 33 deletions
diff --git a/core/data.go b/core/data.go index 7ccc4f9..ddf1db8 100644 --- a/core/data.go +++ b/core/data.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "strings" + "time" ) type Marshaler interface { @@ -21,63 +22,72 @@ const ( TypeTest = 0xFF ) +func ReadDataType(r io.Reader) (DataType, error) { + var data uint8 + if err := read(r, &data); err != nil { + return TypeUnknown, err + } + + dType := DataType(data) + + return dType, nil +} + type Handshake struct { Version uint8 } -func (h Handshake) Marshal() []any { - return []any{h.Version} +func (t Handshake) Marshal() []any { + return []any{t.Version} } func ReadHandshake(r io.Reader) (Handshake, error) { - var d Handshake - err := read(r, &d.Version) - return d, err + var t Handshake + err := read(r, &t.Version) + return t, err } type Test struct { Message string } -func ReadTest(r io.Reader) (Test, error) { - var d Test - err := readString(r, &d.Message) - return d, err +func (t Test) Marshal() []any { + return []any{append([]byte(t.Message), 0x0)} } -func (h Test) Marshal() []any { - return []any{append([]byte(h.Message), 0x0)} +func ReadTest(r io.Reader) (Test, error) { + var t Test + err := readString(r, &t.Message) + return t, err } -func Read(r io.Reader) (any, error) { - dType, err := ReadDataType(r) - if err != nil { - return nil, fmt.Errorf("cannot read data type", err) - } +type Ping struct{} - switch dType { - case TypeUnknown: - return nil, fmt.Errorf("cannot read data type 0x00 (TypeUnknown)") - case TypeHandshake: - return ReadHandshake(r) - case TypeTest: - return ReadTest(r) - default: - return nil, fmt.Errorf("unsupported type: %v", dType) - } +func (t Ping) Marshal() []any { + return []any{} } -func ReadDataType(r io.Reader) (DataType, error) { - var data uint8 - if err := read(r, &data); err != nil { - return TypeUnknown, err - } +type Pong struct { + Timestamp time.Time +} - dType := DataType(data) +func (t Pong) Marshal() []any { + return []any{uint64(t.Timestamp.Unix())} +} - return dType, nil +func ReadPong(r io.Reader) (Pong, error) { + var ( + t Pong + timestamp uint64 + ) + + err := read(r, ×tamp) + t.Timestamp = time.Unix(int64(timestamp), 0) + return t, err } +// + func readString(r io.Reader, ptr *string) error { var ( sb strings.Builder |
