lobby IS a game

This commit is contained in:
Bel LaPointe
2025-02-12 10:29:37 -07:00
parent ad35abb995
commit a2c44498eb
6 changed files with 2 additions and 7 deletions

View File

@@ -0,0 +1,63 @@
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)
}

View File

@@ -0,0 +1,36 @@
package lobby_test
import (
lobby "gitea/price-is-wrong/src/state/fsm/lobby/internal"
"testing"
)
func TestMarshalUnmarshal(t *testing.T) {
cases := map[string]struct {
e lobby.Event
}{
"PlayerJoin": {e: lobby.PlayerJoin{ID: 1}},
"PlayerLeave": {e: lobby.PlayerLeave{ID: 1}},
}
for name, d := range cases {
c := d
t.Run(name, func(t *testing.T) {
b, err := lobby.MarshalEvent(c.e)
if err != nil {
t.Fatal(err)
}
t.Logf("marshalled: %s", b)
e, err := lobby.ParseEvent(b)
if err != nil {
t.Fatal(err)
}
t.Logf("unmarshalled: %+v", e)
if c.e != e {
t.Errorf("expected %+v but got %+v", c.e, e)
}
})
}
}

View File

@@ -0,0 +1,11 @@
package lobby
import "context"
type Lobby interface{}
type lobby struct{}
func NewLobby(ctx context.Context) (Lobby, error) {
return lobby{}, nil
}

View File

@@ -0,0 +1,24 @@
package lobby
import (
"context"
"database/sql"
"fmt"
"gitea/price-is-wrong/src/lib"
)
type Storage interface {
}
type DB struct{ db *sql.DB }
var _ Storage = DB{}
func NewDB(ctx context.Context) (DB, error) {
db := lib.ExtractDB(ctx)
if db == nil {
return DB{}, fmt.Errorf("db in context expected")
}
return DB{db: db}, nil
}

View File

@@ -0,0 +1,15 @@
package lobby_test
import (
"gitea/price-is-wrong/src/lib"
lobby "gitea/price-is-wrong/src/state/fsm/lobby/internal"
"testing"
)
func TestDB(t *testing.T) {
db, err := lobby.NewDB(lib.NewTestCtx(t))
if err != nil {
t.Fatal(err)
}
_ = db
}