af30846091
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>
174 lines
4.9 KiB
Go
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...)
|
|
}
|