package repo /* /state.json /000/state.json /000/race/{UUID}/order/001.json /000/race/{UUID}/report.json /000/battle/{planet_UUID} */ import ( "fmt" "github.com/iliadenisov/galaxy/internal/model/game" ) const ( statePath = "state.json" ) func (r *repo) SaveTurn(t uint, g *game.Game) error { return saveTurn(r.s, t, g) } func saveTurn(s Storage, t uint, g *game.Game) error { path := fmt.Sprintf("%03d/state.json", t) exist, err := s.Exists(path) if err != nil { return NewStorageError(err) } if exist { return NewStateError(fmt.Sprintf("state for turn %d already saved", t)) } if err := s.Write(path, g); err != nil { return NewStorageError(err) } // TODO: save reports for i := range g.Race { saveRace(s, g, i) } // TODO: save battles return saveState(s, g) // FIXME: either save it here, or in tre repo controller } func saveRace(s Storage, g *game.Game, i int) { } func (r *repo) SaveState(g *game.Game) error { return saveState(r.s, g) } func saveState(s Storage, g *game.Game) error { if err := s.Write(statePath, g); err != nil { return NewStorageError(err) } return nil } func (r *repo) LoadState() (*game.Game, error) { return loadState(r.s, true) } func (r *repo) LoadStateSafe() (*game.Game, error) { return loadState(r.s, false) } func loadState(s Storage, locked bool) (*game.Game, error) { var g *game.Game = new(game.Game) path := statePath exist, err := s.Exists(path) if err != nil { return nil, NewStorageError(err) } if !exist { return nil, NewGameNotInitializedError() } if locked { if err := s.Read(path, g); err != nil { return nil, NewStorageError(err) } } else { if err := s.ReadSafe(path, g); err != nil { return nil, NewStorageError(err) } } return g, nil }