84 lines
1.9 KiB
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)
|
|
}
|