#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::sys;
use std::{
convert::TryFrom,
ffi::{c_char, CStr},
};
#[derive(Copy, Clone, Debug, Error, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum SteamError {
#[error("failed to init the steamworks API")]
InitFailed,
#[error("a generic failure from the steamworks API")]
Generic,
#[error("there isn't a network connection to steam or it failed to connect")]
NoConnection,
#[error("password or ticket is invalid")]
InvalidPassword,
#[error("user logged in elsewhere")]
LoggedInElsewhere,
#[error("the protocol version is incorrect")]
InvalidProtocolVersion,
#[error("a parameter is invalid")]
InvalidParameter,
#[error("a file was not found")]
FileNotFound,
#[error("method busy")]
Busy,
#[error("object in invalid state")]
InvalidState,
#[error("name is invalid")]
InvalidName,
#[error("email is invalid")]
InvalidEmail,
#[error("name is not unique")]
DuplicateName,
#[error("access denied")]
AccessDenied,
#[error("operation timed out")]
Timeout,
#[error("VAC2 banned")]
Banned,
#[error("account not found")]
AccountNotFound,
#[error("steamID is invalid")]
InvalidSteamID,
#[error("requested service is unavailable")]
ServiceUnavailable,
#[error("user not logged on")]
NotLoggedOn,
#[error("request is pending")]
Pending,
#[error("encryption/decryption failed")]
EncryptionFailure,
#[error("insufficient privilege")]
InsufficientPrivilege,
#[error("limit exceeded")]
LimitExceeded,
#[error("access revoked")]
Revoked,
#[error("access expired")]
Expired,
#[error("licence/guest pass already redeemed")]
AlreadyRedeemed,
#[error("request is a duplicate")]
DuplicateRequest,
#[error("all games requested already owned")]
AlreadyOwned,
#[error("ip address not found")]
IPNotFound,
#[error("failed to write change")]
PersistFailed,
#[error("failed to acquire access lock")]
LockingFailed,
#[error("logon session replaced")]
LogonSessionReplaced,
#[error("connect failed")]
ConnectFailed,
#[error("handshake failed")]
HandshakeFailed,
#[error("IO failure")]
IOFailure,
#[error("remote disconnect")]
RemoteDisconnect,
#[error("failed to find the requested shopping cart")]
ShoppingCartNotFound,
#[error("action blocked")]
Blocked,
#[error("target is ignoring sender")]
Ignored,
#[error("no matches found")]
NoMatch,
#[error("account disabled")]
AccountDisabled,
#[error("service is read only")]
ServiceReadOnly,
#[error("account not featured")]
AccountNotFeatured,
#[error("administrator ok")]
AdministratorOK,
#[error("version mismatch with transmitted content")]
ContentVersion,
#[error("CM cannot service user")]
TryAnotherCM,
#[error("user already logged in, cached login failed")]
PasswordRequiredToKickSession,
#[error("user already logged in, please wait")]
AlreadyLoggedInElsewhere,
#[error("operation suspended/paused")]
Suspended,
#[error("operation cancelled")]
Cancelled,
#[error("operation cancelled due to data corruption")]
DataCorruption,
#[error("operation cancelled due to the disk being full")]
DiskFull,
#[error("remote/IPC call failed")]
RemoteCallFailed,
#[error("cannot verify unset password")]
PasswordUnset,
#[error("external account not linked to steam")]
ExternalAccountUnlinked,
#[error("PSN ticket invalid")]
PSNTicketInvalid,
#[error("external account already linked")]
ExternalAccountAlreadyLinked,
#[error("sync conflict between remote and local files")]
RemoteFileConflict,
#[error("new password is illegal")]
IllegalPassword,
#[error("new value is the same as old value")]
SameAsPreviousValue,
#[error("2nd factor authentication failed")]
AccountLogonDenied,
#[error("cannot use old password")]
CannotUseOldPassword,
#[error("invalid login auth code")]
InvalidLoginAuthCode,
#[error("no email for 2nd factor authentication")]
AccountLogonDeniedNoMail,
#[error("hardware not capable of IPT")]
HardwareNotCapableOfIPT,
#[error("IPT init error")]
IPTInitError,
#[error("restricted due to parental controls")]
ParentalControlRestricted,
#[error("facebook query failed")]
FacebookQueryError,
#[error("login denied due to exipred auth code")]
ExpiredLoginAuthCode,
#[error("IP login restriction failed")]
IPLoginRestrictionFailed,
#[error("account locked down")]
AccountLockedDown,
#[error("account logon denied verified email required")]
AccountLogonDeniedVerifiedEmailRequired,
#[error("no matching URL")]
NoMatchingURL,
#[error("bad response")]
BadResponse,
#[error("password re-entry required")]
RequirePasswordReEntry,
#[error("value is out of range")]
ValueOutOfRange,
#[error("unexpected error")]
UnexpectedError,
#[error("service disabled")]
Disabled,
#[error("submitted files to CEG are invalid")]
InvalidCEGSubmission,
#[error("device is restricted from action")]
RestrictedDevice,
#[error("region restrictions prevented action")]
RegionLocked,
#[error("temporary rate limit exceeded")]
RateLimitExceeded,
#[error("two-factor authetication required for login")]
AccountLoginDeniedNeedTwoFactor,
#[error("item deleted")]
ItemDeleted,
#[error("account login denied, throttled")]
AccountLoginDeniedThrottle,
#[error("two-factor code mismatched")]
TwoFactorCodeMismatch,
#[error("two-factor activation code mismatched")]
TwoFactorActivationCodeMismatch,
#[error("account associated to multiple partners")]
AccountAssociatedToMultiplePartners,
#[error("data not modified")]
NotModified,
#[error("no mobile device associated with account")]
NoMobileDevice,
#[error("time not synced correctly")]
TimeNotSynced,
#[error("sms code validation failed")]
SmsCodeFailed,
#[error("account limit exceeded for resource")]
AccountLimitExceeded,
#[error("account activity limit exceeded")]
AccountActivityLimitExceeded,
#[error("phone activity limited exceeded")]
PhoneActivityLimitExceeded,
#[error("must refund to wallet instead of payment method")]
RefundToWallet,
#[error("email sending failed")]
EmailSendFailure,
#[error("action cannot be performed until payment has settled")]
NotSettled,
#[error("valid captcha required")]
NeedCaptcha,
#[error("game server login token has been banned")]
GSLTDenied,
#[error("game server owner denied")]
GSOwnerDenied,
#[error("invalid item type")]
InvalidItemType,
#[error("IP banned from action")]
IPBanned,
#[error("game server login token expired")]
GSLTExpired,
#[error("insufficient wallet funds for action")]
InsufficientFunds,
#[error("too many actions pending")]
TooManyPending,
#[error("no site licenses found")]
NoSiteLicensesFound,
#[error("WG network send size exceeded")]
WGNetworkSendExceeded,
}
impl From<sys::EResult> for SteamError {
fn from(r: sys::EResult) -> Self {
match r {
sys::EResult::k_EResultOK => panic!("EResult::k_EResultOK isn't an error"),
sys::EResult::k_EResultFail => SteamError::Generic,
sys::EResult::k_EResultNoConnection => SteamError::NoConnection,
sys::EResult::k_EResultInvalidPassword => SteamError::InvalidPassword,
sys::EResult::k_EResultLoggedInElsewhere => SteamError::LoggedInElsewhere,
sys::EResult::k_EResultInvalidProtocolVer => SteamError::InvalidProtocolVersion,
sys::EResult::k_EResultInvalidParam => SteamError::InvalidParameter,
sys::EResult::k_EResultFileNotFound => SteamError::FileNotFound,
sys::EResult::k_EResultBusy => SteamError::Busy,
sys::EResult::k_EResultInvalidState => SteamError::InvalidState,
sys::EResult::k_EResultInvalidName => SteamError::InvalidName,
sys::EResult::k_EResultInvalidEmail => SteamError::InvalidEmail,
sys::EResult::k_EResultDuplicateName => SteamError::DuplicateName,
sys::EResult::k_EResultAccessDenied => SteamError::AccessDenied,
sys::EResult::k_EResultTimeout => SteamError::Timeout,
sys::EResult::k_EResultBanned => SteamError::Banned,
sys::EResult::k_EResultAccountNotFound => SteamError::AccountNotFound,
sys::EResult::k_EResultInvalidSteamID => SteamError::InvalidSteamID,
sys::EResult::k_EResultServiceUnavailable => SteamError::ServiceUnavailable,
sys::EResult::k_EResultNotLoggedOn => SteamError::NotLoggedOn,
sys::EResult::k_EResultPending => SteamError::Pending,
sys::EResult::k_EResultEncryptionFailure => SteamError::EncryptionFailure,
sys::EResult::k_EResultInsufficientPrivilege => SteamError::InsufficientPrivilege,
sys::EResult::k_EResultLimitExceeded => SteamError::LimitExceeded,
sys::EResult::k_EResultRevoked => SteamError::Revoked,
sys::EResult::k_EResultExpired => SteamError::Expired,
sys::EResult::k_EResultAlreadyRedeemed => SteamError::AlreadyRedeemed,
sys::EResult::k_EResultDuplicateRequest => SteamError::DuplicateRequest,
sys::EResult::k_EResultAlreadyOwned => SteamError::AlreadyOwned,
sys::EResult::k_EResultIPNotFound => SteamError::IPNotFound,
sys::EResult::k_EResultPersistFailed => SteamError::PersistFailed,
sys::EResult::k_EResultLockingFailed => SteamError::LockingFailed,
sys::EResult::k_EResultLogonSessionReplaced => SteamError::LogonSessionReplaced,
sys::EResult::k_EResultConnectFailed => SteamError::ConnectFailed,
sys::EResult::k_EResultHandshakeFailed => SteamError::HandshakeFailed,
sys::EResult::k_EResultIOFailure => SteamError::IOFailure,
sys::EResult::k_EResultRemoteDisconnect => SteamError::RemoteDisconnect,
sys::EResult::k_EResultShoppingCartNotFound => SteamError::ShoppingCartNotFound,
sys::EResult::k_EResultBlocked => SteamError::Blocked,
sys::EResult::k_EResultIgnored => SteamError::Ignored,
sys::EResult::k_EResultNoMatch => SteamError::NoMatch,
sys::EResult::k_EResultAccountDisabled => SteamError::AccountDisabled,
sys::EResult::k_EResultServiceReadOnly => SteamError::ServiceReadOnly,
sys::EResult::k_EResultAccountNotFeatured => SteamError::AccountNotFeatured,
sys::EResult::k_EResultAdministratorOK => SteamError::AdministratorOK,
sys::EResult::k_EResultContentVersion => SteamError::ContentVersion,
sys::EResult::k_EResultTryAnotherCM => SteamError::TryAnotherCM,
sys::EResult::k_EResultPasswordRequiredToKickSession => {
SteamError::PasswordRequiredToKickSession
}
sys::EResult::k_EResultAlreadyLoggedInElsewhere => SteamError::AlreadyLoggedInElsewhere,
sys::EResult::k_EResultSuspended => SteamError::Suspended,
sys::EResult::k_EResultCancelled => SteamError::Cancelled,
sys::EResult::k_EResultDataCorruption => SteamError::DataCorruption,
sys::EResult::k_EResultDiskFull => SteamError::DiskFull,
sys::EResult::k_EResultRemoteCallFailed => SteamError::RemoteCallFailed,
sys::EResult::k_EResultPasswordUnset => SteamError::PasswordUnset,
sys::EResult::k_EResultExternalAccountUnlinked => SteamError::ExternalAccountUnlinked,
sys::EResult::k_EResultPSNTicketInvalid => SteamError::PSNTicketInvalid,
sys::EResult::k_EResultExternalAccountAlreadyLinked => {
SteamError::ExternalAccountAlreadyLinked
}
sys::EResult::k_EResultRemoteFileConflict => SteamError::RemoteFileConflict,
sys::EResult::k_EResultIllegalPassword => SteamError::IllegalPassword,
sys::EResult::k_EResultSameAsPreviousValue => SteamError::SameAsPreviousValue,
sys::EResult::k_EResultAccountLogonDenied => SteamError::AccountLogonDenied,
sys::EResult::k_EResultCannotUseOldPassword => SteamError::CannotUseOldPassword,
sys::EResult::k_EResultInvalidLoginAuthCode => SteamError::InvalidLoginAuthCode,
sys::EResult::k_EResultAccountLogonDeniedNoMail => SteamError::AccountLogonDeniedNoMail,
sys::EResult::k_EResultHardwareNotCapableOfIPT => SteamError::HardwareNotCapableOfIPT,
sys::EResult::k_EResultIPTInitError => SteamError::IPTInitError,
sys::EResult::k_EResultParentalControlRestricted => {
SteamError::ParentalControlRestricted
}
sys::EResult::k_EResultFacebookQueryError => SteamError::FacebookQueryError,
sys::EResult::k_EResultExpiredLoginAuthCode => SteamError::ExpiredLoginAuthCode,
sys::EResult::k_EResultIPLoginRestrictionFailed => SteamError::IPLoginRestrictionFailed,
sys::EResult::k_EResultAccountLockedDown => SteamError::AccountLockedDown,
sys::EResult::k_EResultAccountLogonDeniedVerifiedEmailRequired => {
SteamError::AccountLogonDeniedVerifiedEmailRequired
}
sys::EResult::k_EResultNoMatchingURL => SteamError::NoMatchingURL,
sys::EResult::k_EResultBadResponse => SteamError::BadResponse,
sys::EResult::k_EResultRequirePasswordReEntry => SteamError::RequirePasswordReEntry,
sys::EResult::k_EResultValueOutOfRange => SteamError::ValueOutOfRange,
sys::EResult::k_EResultUnexpectedError => SteamError::UnexpectedError,
sys::EResult::k_EResultDisabled => SteamError::Disabled,
sys::EResult::k_EResultInvalidCEGSubmission => SteamError::InvalidCEGSubmission,
sys::EResult::k_EResultRestrictedDevice => SteamError::RestrictedDevice,
sys::EResult::k_EResultRegionLocked => SteamError::RegionLocked,
sys::EResult::k_EResultRateLimitExceeded => SteamError::RateLimitExceeded,
sys::EResult::k_EResultAccountLoginDeniedNeedTwoFactor => {
SteamError::AccountLoginDeniedNeedTwoFactor
}
sys::EResult::k_EResultItemDeleted => SteamError::ItemDeleted,
sys::EResult::k_EResultAccountLoginDeniedThrottle => {
SteamError::AccountLoginDeniedThrottle
}
sys::EResult::k_EResultTwoFactorCodeMismatch => SteamError::TwoFactorCodeMismatch,
sys::EResult::k_EResultTwoFactorActivationCodeMismatch => {
SteamError::TwoFactorActivationCodeMismatch
}
sys::EResult::k_EResultAccountAssociatedToMultiplePartners => {
SteamError::AccountAssociatedToMultiplePartners
}
sys::EResult::k_EResultNotModified => SteamError::NotModified,
sys::EResult::k_EResultNoMobileDevice => SteamError::NoMobileDevice,
sys::EResult::k_EResultTimeNotSynced => SteamError::TimeNotSynced,
sys::EResult::k_EResultSmsCodeFailed => SteamError::SmsCodeFailed,
sys::EResult::k_EResultAccountLimitExceeded => SteamError::AccountLimitExceeded,
sys::EResult::k_EResultAccountActivityLimitExceeded => {
SteamError::AccountActivityLimitExceeded
}
sys::EResult::k_EResultPhoneActivityLimitExceeded => {
SteamError::PhoneActivityLimitExceeded
}
sys::EResult::k_EResultRefundToWallet => SteamError::RefundToWallet,
sys::EResult::k_EResultEmailSendFailure => SteamError::EmailSendFailure,
sys::EResult::k_EResultNotSettled => SteamError::NotSettled,
sys::EResult::k_EResultNeedCaptcha => SteamError::NeedCaptcha,
sys::EResult::k_EResultGSLTDenied => SteamError::GSLTDenied,
sys::EResult::k_EResultGSOwnerDenied => SteamError::GSOwnerDenied,
sys::EResult::k_EResultInvalidItemType => SteamError::InvalidItemType,
sys::EResult::k_EResultIPBanned => SteamError::IPBanned,
sys::EResult::k_EResultGSLTExpired => SteamError::GSLTExpired,
sys::EResult::k_EResultInsufficientFunds => SteamError::InsufficientFunds,
sys::EResult::k_EResultTooManyPending => SteamError::TooManyPending,
sys::EResult::k_EResultNoSiteLicensesFound => SteamError::NoSiteLicensesFound,
sys::EResult::k_EResultWGNetworkSendExceeded => SteamError::WGNetworkSendExceeded,
_ => unreachable!(),
}
}
}
impl TryFrom<i64> for SteamError {
type Error = InvalidErrorCode;
fn try_from(r: i64) -> Result<Self, Self::Error> {
let error = match r {
x if x == sys::EResult::k_EResultFail as i64 => SteamError::Generic,
x if x == sys::EResult::k_EResultNoConnection as i64 => SteamError::NoConnection,
x if x == sys::EResult::k_EResultInvalidPassword as i64 => SteamError::InvalidPassword,
x if x == sys::EResult::k_EResultLoggedInElsewhere as i64 => {
SteamError::LoggedInElsewhere
}
x if x == sys::EResult::k_EResultInvalidProtocolVer as i64 => {
SteamError::InvalidProtocolVersion
}
x if x == sys::EResult::k_EResultInvalidParam as i64 => SteamError::InvalidParameter,
x if x == sys::EResult::k_EResultFileNotFound as i64 => SteamError::FileNotFound,
x if x == sys::EResult::k_EResultBusy as i64 => SteamError::Busy,
x if x == sys::EResult::k_EResultInvalidState as i64 => SteamError::InvalidState,
x if x == sys::EResult::k_EResultInvalidName as i64 => SteamError::InvalidName,
x if x == sys::EResult::k_EResultInvalidEmail as i64 => SteamError::InvalidEmail,
x if x == sys::EResult::k_EResultDuplicateName as i64 => SteamError::DuplicateName,
x if x == sys::EResult::k_EResultAccessDenied as i64 => SteamError::AccessDenied,
x if x == sys::EResult::k_EResultTimeout as i64 => SteamError::Timeout,
x if x == sys::EResult::k_EResultBanned as i64 => SteamError::Banned,
x if x == sys::EResult::k_EResultAccountNotFound as i64 => SteamError::AccountNotFound,
x if x == sys::EResult::k_EResultInvalidSteamID as i64 => SteamError::InvalidSteamID,
x if x == sys::EResult::k_EResultServiceUnavailable as i64 => {
SteamError::ServiceUnavailable
}
x if x == sys::EResult::k_EResultNotLoggedOn as i64 => SteamError::NotLoggedOn,
x if x == sys::EResult::k_EResultPending as i64 => SteamError::Pending,
x if x == sys::EResult::k_EResultEncryptionFailure as i64 => {
SteamError::EncryptionFailure
}
x if x == sys::EResult::k_EResultInsufficientPrivilege as i64 => {
SteamError::InsufficientPrivilege
}
x if x == sys::EResult::k_EResultLimitExceeded as i64 => SteamError::LimitExceeded,
x if x == sys::EResult::k_EResultRevoked as i64 => SteamError::Revoked,
x if x == sys::EResult::k_EResultExpired as i64 => SteamError::Expired,
x if x == sys::EResult::k_EResultAlreadyRedeemed as i64 => SteamError::AlreadyRedeemed,
x if x == sys::EResult::k_EResultDuplicateRequest as i64 => {
SteamError::DuplicateRequest
}
x if x == sys::EResult::k_EResultAlreadyOwned as i64 => SteamError::AlreadyOwned,
x if x == sys::EResult::k_EResultIPNotFound as i64 => SteamError::IPNotFound,
x if x == sys::EResult::k_EResultPersistFailed as i64 => SteamError::PersistFailed,
x if x == sys::EResult::k_EResultLockingFailed as i64 => SteamError::LockingFailed,
x if x == sys::EResult::k_EResultLogonSessionReplaced as i64 => {
SteamError::LogonSessionReplaced
}
x if x == sys::EResult::k_EResultConnectFailed as i64 => SteamError::ConnectFailed,
x if x == sys::EResult::k_EResultHandshakeFailed as i64 => SteamError::HandshakeFailed,
x if x == sys::EResult::k_EResultIOFailure as i64 => SteamError::IOFailure,
x if x == sys::EResult::k_EResultRemoteDisconnect as i64 => {
SteamError::RemoteDisconnect
}
x if x == sys::EResult::k_EResultShoppingCartNotFound as i64 => {
SteamError::ShoppingCartNotFound
}
x if x == sys::EResult::k_EResultBlocked as i64 => SteamError::Blocked,
x if x == sys::EResult::k_EResultIgnored as i64 => SteamError::Ignored,
x if x == sys::EResult::k_EResultNoMatch as i64 => SteamError::NoMatch,
x if x == sys::EResult::k_EResultAccountDisabled as i64 => SteamError::AccountDisabled,
x if x == sys::EResult::k_EResultServiceReadOnly as i64 => SteamError::ServiceReadOnly,
x if x == sys::EResult::k_EResultAccountNotFeatured as i64 => {
SteamError::AccountNotFeatured
}
x if x == sys::EResult::k_EResultAdministratorOK as i64 => SteamError::AdministratorOK,
x if x == sys::EResult::k_EResultContentVersion as i64 => SteamError::ContentVersion,
x if x == sys::EResult::k_EResultTryAnotherCM as i64 => SteamError::TryAnotherCM,
x if x == sys::EResult::k_EResultPasswordRequiredToKickSession as i64 => {
SteamError::PasswordRequiredToKickSession
}
x if x == sys::EResult::k_EResultAlreadyLoggedInElsewhere as i64 => {
SteamError::AlreadyLoggedInElsewhere
}
x if x == sys::EResult::k_EResultSuspended as i64 => SteamError::Suspended,
x if x == sys::EResult::k_EResultCancelled as i64 => SteamError::Cancelled,
x if x == sys::EResult::k_EResultDataCorruption as i64 => SteamError::DataCorruption,
x if x == sys::EResult::k_EResultDiskFull as i64 => SteamError::DiskFull,
x if x == sys::EResult::k_EResultRemoteCallFailed as i64 => {
SteamError::RemoteCallFailed
}
x if x == sys::EResult::k_EResultPasswordUnset as i64 => SteamError::PasswordUnset,
x if x == sys::EResult::k_EResultExternalAccountUnlinked as i64 => {
SteamError::ExternalAccountUnlinked
}
x if x == sys::EResult::k_EResultPSNTicketInvalid as i64 => {
SteamError::PSNTicketInvalid
}
x if x == sys::EResult::k_EResultExternalAccountAlreadyLinked as i64 => {
SteamError::ExternalAccountAlreadyLinked
}
x if x == sys::EResult::k_EResultRemoteFileConflict as i64 => {
SteamError::RemoteFileConflict
}
x if x == sys::EResult::k_EResultIllegalPassword as i64 => SteamError::IllegalPassword,
x if x == sys::EResult::k_EResultSameAsPreviousValue as i64 => {
SteamError::SameAsPreviousValue
}
x if x == sys::EResult::k_EResultAccountLogonDenied as i64 => {
SteamError::AccountLogonDenied
}
x if x == sys::EResult::k_EResultCannotUseOldPassword as i64 => {
SteamError::CannotUseOldPassword
}
x if x == sys::EResult::k_EResultInvalidLoginAuthCode as i64 => {
SteamError::InvalidLoginAuthCode
}
x if x == sys::EResult::k_EResultAccountLogonDeniedNoMail as i64 => {
SteamError::AccountLogonDeniedNoMail
}
x if x == sys::EResult::k_EResultHardwareNotCapableOfIPT as i64 => {
SteamError::HardwareNotCapableOfIPT
}
x if x == sys::EResult::k_EResultIPTInitError as i64 => SteamError::IPTInitError,
x if x == sys::EResult::k_EResultParentalControlRestricted as i64 => {
SteamError::ParentalControlRestricted
}
x if x == sys::EResult::k_EResultFacebookQueryError as i64 => {
SteamError::FacebookQueryError
}
x if x == sys::EResult::k_EResultExpiredLoginAuthCode as i64 => {
SteamError::ExpiredLoginAuthCode
}
x if x == sys::EResult::k_EResultIPLoginRestrictionFailed as i64 => {
SteamError::IPLoginRestrictionFailed
}
x if x == sys::EResult::k_EResultAccountLockedDown as i64 => {
SteamError::AccountLockedDown
}
x if x == sys::EResult::k_EResultAccountLogonDeniedVerifiedEmailRequired as i64 => {
SteamError::AccountLogonDeniedVerifiedEmailRequired
}
x if x == sys::EResult::k_EResultNoMatchingURL as i64 => SteamError::NoMatchingURL,
x if x == sys::EResult::k_EResultBadResponse as i64 => SteamError::BadResponse,
x if x == sys::EResult::k_EResultRequirePasswordReEntry as i64 => {
SteamError::RequirePasswordReEntry
}
x if x == sys::EResult::k_EResultValueOutOfRange as i64 => SteamError::ValueOutOfRange,
x if x == sys::EResult::k_EResultUnexpectedError as i64 => SteamError::UnexpectedError,
x if x == sys::EResult::k_EResultDisabled as i64 => SteamError::Disabled,
x if x == sys::EResult::k_EResultInvalidCEGSubmission as i64 => {
SteamError::InvalidCEGSubmission
}
x if x == sys::EResult::k_EResultRestrictedDevice as i64 => {
SteamError::RestrictedDevice
}
x if x == sys::EResult::k_EResultRegionLocked as i64 => SteamError::RegionLocked,
x if x == sys::EResult::k_EResultRateLimitExceeded as i64 => {
SteamError::RateLimitExceeded
}
x if x == sys::EResult::k_EResultAccountLoginDeniedNeedTwoFactor as i64 => {
SteamError::AccountLoginDeniedNeedTwoFactor
}
x if x == sys::EResult::k_EResultItemDeleted as i64 => SteamError::ItemDeleted,
x if x == sys::EResult::k_EResultAccountLoginDeniedThrottle as i64 => {
SteamError::AccountLoginDeniedThrottle
}
x if x == sys::EResult::k_EResultTwoFactorCodeMismatch as i64 => {
SteamError::TwoFactorCodeMismatch
}
x if x == sys::EResult::k_EResultTwoFactorActivationCodeMismatch as i64 => {
SteamError::TwoFactorActivationCodeMismatch
}
x if x == sys::EResult::k_EResultAccountAssociatedToMultiplePartners as i64 => {
SteamError::AccountAssociatedToMultiplePartners
}
x if x == sys::EResult::k_EResultNotModified as i64 => SteamError::NotModified,
x if x == sys::EResult::k_EResultNoMobileDevice as i64 => SteamError::NoMobileDevice,
x if x == sys::EResult::k_EResultTimeNotSynced as i64 => SteamError::TimeNotSynced,
x if x == sys::EResult::k_EResultSmsCodeFailed as i64 => SteamError::SmsCodeFailed,
x if x == sys::EResult::k_EResultAccountLimitExceeded as i64 => {
SteamError::AccountLimitExceeded
}
x if x == sys::EResult::k_EResultAccountActivityLimitExceeded as i64 => {
SteamError::AccountActivityLimitExceeded
}
x if x == sys::EResult::k_EResultPhoneActivityLimitExceeded as i64 => {
SteamError::PhoneActivityLimitExceeded
}
x if x == sys::EResult::k_EResultRefundToWallet as i64 => SteamError::RefundToWallet,
x if x == sys::EResult::k_EResultEmailSendFailure as i64 => {
SteamError::EmailSendFailure
}
x if x == sys::EResult::k_EResultNotSettled as i64 => SteamError::NotSettled,
x if x == sys::EResult::k_EResultNeedCaptcha as i64 => SteamError::NeedCaptcha,
x if x == sys::EResult::k_EResultGSLTDenied as i64 => SteamError::GSLTDenied,
x if x == sys::EResult::k_EResultGSOwnerDenied as i64 => SteamError::GSOwnerDenied,
x if x == sys::EResult::k_EResultInvalidItemType as i64 => SteamError::InvalidItemType,
x if x == sys::EResult::k_EResultIPBanned as i64 => SteamError::IPBanned,
x if x == sys::EResult::k_EResultGSLTExpired as i64 => SteamError::GSLTExpired,
x if x == sys::EResult::k_EResultInsufficientFunds as i64 => {
SteamError::InsufficientFunds
}
x if x == sys::EResult::k_EResultTooManyPending as i64 => SteamError::TooManyPending,
x if x == sys::EResult::k_EResultNoSiteLicensesFound as i64 => {
SteamError::NoSiteLicensesFound
}
x if x == sys::EResult::k_EResultWGNetworkSendExceeded as i64 => {
SteamError::WGNetworkSendExceeded
}
_ => return Err(InvalidErrorCode),
};
Ok(error)
}
}
#[derive(Debug, Error)]
#[error("error code could not be converted to rust enum")]
pub struct InvalidErrorCode;
#[derive(Clone, Debug, Error, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum SteamAPIInitError {
#[error("Some other failure")]
FailedGeneric(String),
#[error("We cannot connect to Steam, steam probably isn't running")]
NoSteamClient(String),
#[error("Steam client appears to be out of date")]
VersionMismatch(String),
}
impl SteamAPIInitError {
pub fn from_result_and_message(
result: sys::ESteamAPIInitResult,
message: sys::SteamErrMsg,
) -> Self {
let err_string = unsafe {
let cstr = CStr::from_ptr(message.as_ptr() as *const c_char);
cstr.to_string_lossy().to_owned().into_owned()
};
match result {
sys::ESteamAPIInitResult::k_ESteamAPIInitResult_FailedGeneric => {
SteamAPIInitError::FailedGeneric(err_string)
}
sys::ESteamAPIInitResult::k_ESteamAPIInitResult_NoSteamClient => {
SteamAPIInitError::NoSteamClient(err_string)
}
sys::ESteamAPIInitResult::k_ESteamAPIInitResult_VersionMismatch => {
SteamAPIInitError::VersionMismatch(err_string)
}
_ => unreachable!(),
}
}
}