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) }