package lobby import "errors" // Sentinel errors surface common rejection reasons across the lobby // package. Handlers map them to HTTP envelopes through `respondLobbyError` // in `internal/server/handlers_user_lobby_helpers.go`. // // Adding a new sentinel here is a deliberate API change: it appears in the // handler error map and may surface as a new wire `code` value. Reuse the // existing set when the behaviour overlaps. var ( // ErrInvalidInput reports request-level validation failures (empty // fields, malformed cron expressions, unknown enum values, race-name // policy rejections). Maps to 400 invalid_request. ErrInvalidInput = errors.New("lobby: invalid input") // ErrNotFound reports that the requested record (game, application, // invite, membership, race name) does not exist or is not visible to // the caller. Maps to 404 not_found. ErrNotFound = errors.New("lobby: not found") // ErrForbidden reports that the caller is authenticated but not // authorised for the requested action — most commonly "not the owner // of this private game". Maps to 403 forbidden. ErrForbidden = errors.New("lobby: forbidden") // ErrConflict reports that the requested action conflicts with the // current persisted state (illegal status transition, duplicate // application, race-name canonical taken, invite already redeemed). // Maps to 409 conflict. ErrConflict = errors.New("lobby: conflict") // ErrInvalidStatus reports a state-machine transition rejected by the // game/application/invite/membership status. Treated as ErrConflict // at the wire boundary; carried as a separate sentinel so transition // callers can branch on it without parsing the wrapped message. ErrInvalidStatus = errors.New("lobby: invalid status transition") // ErrRaceNameTaken reports that a race-name canonical key is already // claimed by a different user (registered, reserved, or // pending_registration). Treated as ErrConflict at the wire boundary. ErrRaceNameTaken = errors.New("lobby: race name is taken") // ErrEntitlementExceeded reports that the caller already holds the // maximum number of registered race names allowed by their tier. // Treated as ErrConflict at the wire boundary. ErrEntitlementExceeded = errors.New("lobby: entitlement quota exceeded") // ErrPendingExpired reports that the pending_registration window // passed before the user attempted to promote it to registered. // Treated as ErrConflict at the wire boundary. ErrPendingExpired = errors.New("lobby: pending registration expired") )