record

package
v0.0.0-...-6b15219 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 18, 2023 License: Apache-2.0 Imports: 14 Imported by: 0

Documentation

Overview

Package record is a package to open, read, and save game records stored in filesystem's format.

We encode states as diffs by default, but if that's not possible (for example, the diff the diffing library gave did not give us a valid diff because applying it to the left input does not provide the right input) then we convert to a full encoding mode, which encodes the entirerty of the blobs. Every time we save we try to revert to a diffed encoding if possible. This allows these files to be relatively resilient to errors in the undelrying diff library and heal as that library improves.

Note that because reading the files from disk is expensive, this library maintains a cache of records by filename that it returns, for a considerable performance boost. This means that changes in the filesystem while the storage layer is running that aren't mediated by this controller will cause undefined behavior.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Record

type Record struct {
	// contains filtered or unexported fields
}

Record is a record of moves, states, and game. Get a new one based on the contents of a file with New(). If you want a new blank one you can just use a zero value of this.

func EmptyWithFullStateEncoding

func EmptyWithFullStateEncoding() *Record

EmptyWithFullStateEncoding returns a record that will default to full state encoding and will never automatically try to reduce down to fullstateencoding. Primarily useful for testing.

func New

func New(filename string) (*Record, error)

New returns a new record with the data encoded in the file. If you want one that does not yet have a file backing it, you can just use an empty value of Record. If a record with that filename has already been saved, it will return that record.

func (*Record) AddGameAndCurrentState

func (r *Record) AddGameAndCurrentState(game *boardgame.GameStorageRecord, state boardgame.StateStorageRecord, move *boardgame.MoveStorageRecord) error

AddGameAndCurrentState adds the game, state, and move (if non-nil), ready for saving. Designed to be used in a SaveGameAndCurrentState method. If the state cannot be succcesfully encoded as a diffed encoding (due to an underlying issue in the diffing library, for example, that gives an invalid diff) then this will automatically expand the record into a FullStateEncoding mode.

func (*Record) Compress

func (r *Record) Compress() error

Compress converts from full state encoding to diff encoding, if possible. Noop if already diff encoded.

func (*Record) Description

func (r *Record) Description() string

Description returns the top-level description string set in the json file. You can call SetDescription to set it.

func (*Record) Expand

func (r *Record) Expand() error

Expand converts from diff state encoding to full encoding, if possible. Noop if already full encoded.

func (*Record) FullStateEncoding

func (r *Record) FullStateEncoding() bool

FullStateEncoding returns whether the record is using full state encoding instead of the default diff.

func (*Record) Game

func (r *Record) Game() *boardgame.GameStorageRecord

Game returns the GameStorageRecord in that record.

func (*Record) Move

func (r *Record) Move(version int) (*boardgame.MoveStorageRecord, error)

Move returns the move for that version from that record. Note that it might be a copy from the underlying value.

func (*Record) Path

func (r *Record) Path() string

Path returns the string represeting the filename that this record represents (the filename that was passed to New()). Note that if you call Save() on a record, it doesn't update this value.

func (*Record) RawMoves

func (r *Record) RawMoves() []*boardgame.MoveStorageRecord

RawMoves returns the actual raw MoveStorageRecords, which golden needs access to to align timestamps. The moves are 1-indexed, and their Initator, Version, and Timestamp fields might be in relative values that will trip up other logic outside of this package.

func (*Record) Save

func (r *Record) Save(filename string, fullEncodingErrors bool) error

Save saves to the given path. Always try to Compress() if possible. If fullEncodingErrors is true then we'll error if we can't compress, otherwise we'll be OK with saving a full encoded version.

func (*Record) SetDescription

func (r *Record) SetDescription(description string)

SetDescription allows you to set the description that will be written.

func (*Record) State

func (r *Record) State(version int) (boardgame.StateStorageRecord, error)

State fetches the State object at that version. It can return an error because under the covers it has to apply serialized patches.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL