game_sync/gamesrv/slotspkg/slots/entity/serializer.go

84 lines
1.9 KiB
Go

package entity
import (
"encoding/json"
"mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors"
"mongo.games.com/game/gamesrv/slotspkg/internal/module/shared"
"mongo.games.com/game/gamesrv/slotspkg/slots/reg"
"reflect"
)
// Deserialize deserializes `Data` into `NodeTree`
func (e *Entity) Deserialize() {
data := e.Player.GetTheme(e.Theme)
if data == nil {
panic(errors.LeakThemeData.ErrorWith(e.Theme))
}
data.Get(e.NodeTree)
e.Customs = make(map[int64]interface{})
for _, node := range e.NodeTree.Nodes {
for _, feature := range node.Features {
if v := e.deserializeCustom(feature); v != nil {
e.Customs[feature.ID] = v
}
}
}
for _, feature := range e.NodeTree.ImageFeatures {
if v := e.deserializeCustom(feature); v != nil {
e.Customs[feature.ID] = v
}
}
}
// Serialize serializes `NodeTree` into `Data`
func (e *Entity) Serialize() {
for _, node := range e.NodeTree.Nodes {
for _, feature := range node.Features {
feature.Custom = e.serializeCustom(feature)
}
}
for _, feature := range e.NodeTree.ImageFeatures {
feature.Custom = e.serializeCustom(feature)
}
data := e.Player.GetTheme(e.Theme)
if data == nil {
panic(errors.LeakThemeData.ErrorWith(e.Theme))
}
data.Set(e.NodeTree)
}
func (e *Entity) deserializeCustom(feature *shared.Feature) interface{} {
if feature.Type == "" {
return nil
}
t, ok := reg.Customs[feature.Type]
if !ok {
panic(errors.FeatureTypeNotFound.ErrorWith(feature.Type))
}
v := reflect.New(t.Elem()).Interface()
err := json.Unmarshal([]byte(feature.Custom), v)
if err != nil {
panic(err)
}
return v
}
func (e *Entity) serializeCustom(feature *shared.Feature) string {
custom, ok := e.Customs[feature.ID]
if !ok {
panic(errors.CustomNotFound.ErrorWith(feature.ID))
}
if custom == nil {
panic(errors.CustomNil.ErrorWith(feature.ID))
}
data, err := json.Marshal(custom)
if err != nil {
panic(err)
}
return string(data)
}