package action import ( "errors" "git.reya.zone/reya/hexmap/server/state" "go.uber.org/zap/zapcore" ) var ( // ErrNoOp is returned when an action has no effect. ErrNoOp = errors.New("action's effects were already applied, or it's an empty action") // ErrNoTransparentColors is returned when a user tries to set their active color or a cell color to transparent. // Transparent here is defined as having an alpha component of less than 15 (0xF). ErrNoTransparentColors = errors.New("transparent colors not allowed") ) type Type string // Action is the interface for actions that can be shared between clients, or between the server and a client. type Action interface { zapcore.ObjectMarshaler // Type gives the Javascript type that is sent over the wire. Type() Type // Apply causes the action's effects to be applied to s, mutating it in place. // All Actions must conform to the standard that if an action can't be correctly applied, or if it would // have no effect, it returns an error without changing s. // If an action can be correctly applied but would have no effect, it should return ErrNoOp. // If an action is correctly applied and has an effect, it should return nil. Apply(s *state.Synced) error // fromJSONMap causes the action's state to be overwritten by data from the given map. fromJSONMap(data map[string] interface{}) error } type parseAction struct { Type string `json:"type"` } type Slice []Action func (s Slice) MarshalLogArray(encoder zapcore.ArrayEncoder) error { var finalErr error = nil for _, a := range s { err := encoder.AppendObject(a) if err != nil && finalErr == nil { finalErr = err } } return finalErr }