Files
galaxy-game/pkg/error/input.go
T
Ilia Denisov af30846091
Tests · Go / test (push) Successful in 2m2s
Tests · Go / test (pull_request) Successful in 3m3s
Tests · Integration / integration (pull_request) Successful in 1m40s
fix(game): #59 — per-command rejection on PUT /api/v1/order
Validation of a player's order now applies every command against a
transient game-state snapshot and records the per-command outcome
(cmdApplied, cmdErrorCode) in each command's meta. The order is
persisted even when some commands are rejected, and the response is
202 + UserGamesOrder so clients can surface the partial failure
without the chain collapsing into "downstream service is unavailable".

Pkg/error consts are reshelved onto three explicit ranges with a
package doc and helpers (IsInternalCode/IsInputCode/IsGameStateCode):
1xxx internal/server (500/501), 2xxx structural input (400), 3xxx
game-state per-command rejection (400 when escaping HTTP, otherwise
recorded as cmdErrorCode). Two pre-existing typos fixed mechanically
(ErrBeakGroupNumberNotEnough -> ErrBreakGroupNumberNotEnough,
ErrRaceExinct -> ErrRaceExtinct) along with all callsites.

Engine errorResponse maps *GenericError by shelf rather than mapping
everything to 500. The Quit-not-last structural check in
Controller.ValidateOrder is preserved and its type assertion fixed
(was a value assertion against a pointer-typed command, so the check
silently never fired).

Backend, gateway and UI are unchanged — they were already correct on
the 202 path; only the engine collapsing per-command rejection into
500 was needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 09:36:29 +02:00

174 lines
4.9 KiB
Go

package error
func NewRaceUnknownError(arg ...any) error {
return newGenericError(ErrInputUnknownRace, arg...)
}
func NewUnknownRelationError(arg ...any) error {
return newGenericError(ErrInputUnknownRelation, arg...)
}
func NewSameRaceError(arg ...any) error {
return newGenericError(ErrInputSameRace, arg...)
}
func NewEntityTypeNameValidationError(arg ...any) error {
return newGenericError(ErrInputEntityTypeNameInvalid, arg...)
}
func NewEntityDuplicateIdentifierError(arg ...any) error {
return newGenericError(ErrInputNewEntityDuplicateIdentifier, arg...)
}
func NewEntityTypeNameEqualityError(arg ...any) error {
return newGenericError(ErrInputEntityTypeNameEquality, arg...)
}
func NewEntityNotExistsError(arg ...any) error {
return newGenericError(ErrInputEntityNotExists, arg...)
}
func NewEntityNotOwnedError(arg ...any) error {
return newGenericError(ErrInputEntityNotOwned, arg...)
}
func NewEntityInUseError(arg ...any) error {
return newGenericError(ErrEntityInUse, arg...)
}
func NewPlanetNumberError(arg ...any) error {
return newGenericError(ErrInputPlanetNumber, arg...)
}
func NewDriveValueError(arg ...any) error {
return newGenericError(ErrInputDriveValue, arg...)
}
func NewWeaponsValueError(arg ...any) error {
return newGenericError(ErrInputWeaponsValue, arg...)
}
func NewShieldsValueError(arg ...any) error {
return newGenericError(ErrInputShieldsValue, arg...)
}
func NewCargoValueError(arg ...any) error {
return newGenericError(ErrInputCargoValue, arg...)
}
func NewShipTypeArmamentValueError(arg ...any) error {
return newGenericError(ErrInputShipTypeArmamentValue, arg...)
}
func NewShipTypeArmamentAndWeaponsValueError(arg ...any) error {
return newGenericError(ErrInputShipTypeWeaponsAndArmamentValue, arg...)
}
func NewShipTypeShipTypeZeroValuesError(arg ...any) error {
return newGenericError(ErrInputShipTypeZeroValues, arg...)
}
func NewScienceSumValuesError(arg ...any) error {
return newGenericError(ErrInputScienceSumValues, arg...)
}
func NewProductionInvalidError(arg ...any) error {
return newGenericError(ErrInputProductionInvalid, arg...)
}
func NewCargoTypeInvalidError(arg ...any) error {
return newGenericError(ErrInputCargoTypeInvalid, arg...)
}
func NewCargoLoadNotEnoughError(arg ...any) error {
return newGenericError(ErrInputCargoLoadNotEnough, arg...)
}
func NewCargoLoadNotEqualError(arg ...any) error {
return newGenericError(ErrInputCargoLoadNotEqual, arg...)
}
func NewNoCargoBayError(arg ...any) error {
return newGenericError(ErrInputNoCargoBay, arg...)
}
func NewCargoLoadNoSpaceLeftError(arg ...any) error {
return newGenericError(ErrInputCargoLoadNoSpaceLeft, arg...)
}
func NewCargoUnloadEmptyError(arg ...any) error {
return newGenericError(ErrInputCargoUnloadEmpty, arg...)
}
func NewBreakGroupIllegalNumberError(arg ...any) error {
return newGenericError(ErrInputBreakGroupIllegalNumber, arg...)
}
func NewMergeShipTypeNotEqualError(arg ...any) error {
return newGenericError(ErrMergeShipTypeNotEqual, arg...)
}
func NewBreakGroupNumberNotEnoughError(arg ...any) error {
return newGenericError(ErrBreakGroupNumberNotEnough, arg...)
}
func NewShipsBusyError(arg ...any) error {
return newGenericError(ErrShipsBusy, arg...)
}
func NewShipsNotOnSamePlanetError(arg ...any) error {
return newGenericError(ErrShipsNotOnSamePlanet, arg...)
}
func NewTechUnknownError(arg ...any) error {
return newGenericError(ErrInputTechUnknown, arg...)
}
func NewTechInvalidMixingError(arg ...any) error {
return newGenericError(ErrInputTechInvalidMixing, arg...)
}
func NewUpgradeShipTechNotUsedError(arg ...any) error {
return newGenericError(ErrInputUpgradeShipTechNotUsed, arg...)
}
func NewUpgradeParameterNotAllowedError(arg ...any) error {
return newGenericError(ErrInputUpgradeParameterNotAllowed, arg...)
}
func NewUpgradeShipsAlreadyUpToDateError(arg ...any) error {
return newGenericError(ErrInputUpgradeShipsAlreadyUpToDate, arg...)
}
func NewUpgradeGroupNumberNotEnoughError(arg ...any) error {
return newGenericError(ErrUpgradeGroupNumberNotEnough, arg...)
}
func NewUpgradeInsufficientResourcesError(arg ...any) error {
return newGenericError(ErrUpgradeInsufficientResources, arg...)
}
func NewUpgradeTechLevelInsufficientError(arg ...any) error {
return newGenericError(ErrInputUpgradeTechLevelInsufficient, arg...)
}
func NewSendShipHasNoDrivesError(arg ...any) error {
return newGenericError(ErrSendShipHasNoDrives, arg...)
}
func NewSendUnreachableDestinationError(arg ...any) error {
return newGenericError(ErrSendUnreachableDestination, arg...)
}
func NewSendShipOwnerHasNoPlanetsError(arg ...any) error {
return newGenericError(ErrSendShipOwnerHasNoPlanets, arg...)
}
func NewQuitCommandFollowedByCommandError(arg ...any) error {
return newGenericError(ErrInputQuitCommandFollowedByCommand, arg...)
}
func NewUnrecognizedCommandError(arg ...any) error {
return newGenericError(ErrInputUnrecognizedCommand, arg...)
}