price-is-wrong/src/state/fsm/lobby/internal/event.go

64 lines
1.2 KiB
Go

package lobby
import (
"encoding/json"
"fmt"
)
type Event interface {
LobbyEvent()
}
type PlayerJoin struct {
ID int
}
func (PlayerJoin) LobbyEvent() {}
type PlayerLeave struct {
ID int
}
func (PlayerLeave) LobbyEvent() {}
func ParseEvent(b []byte) (Event, error) {
var wrapper struct {
Type string `json:"type"`
Package string `json:"package"`
Payload json.RawMessage `json:"payload"`
}
if err := json.Unmarshal(b, &wrapper); err != nil {
return nil, err
} else if wrapper.Package != "lobby" {
return nil, nil
}
var e Event
var err error
switch wrapper.Type {
case "lobby.PlayerJoin":
v := PlayerJoin{}
err = json.Unmarshal(wrapper.Payload, &v)
e = v
case "lobby.PlayerLeave":
v := PlayerLeave{}
err = json.Unmarshal(wrapper.Payload, &v)
e = v
default:
return nil, fmt.Errorf("failed to parse event %q", wrapper.Type)
}
return e, err
}
func MarshalEvent(e Event) ([]byte, error) {
var marshalme struct {
Payload Event `json:"payload"`
Type string `json:"type"`
Package string `json:"package"`
}
marshalme.Payload = e
marshalme.Type = fmt.Sprintf("%T", e)
marshalme.Package = "lobby"
return json.Marshal(marshalme)
}