race-api 0.2.6

RACE Protocol core lib
Documentation
use borsh::{BorshDeserialize, BorshSerialize};
use thiserror::Error;

#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};

use crate::types::{DecisionId, RandomId};

#[derive(Error, Debug, BorshDeserialize, BorshSerialize, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Error {
    #[error("Player already joined: {0}")]
    PlayerAlreadyJoined(String),

    #[error("Position Occupied: {0}")]
    PositionOccupied(usize),

    #[error("Game is full: {0}")]
    GameIsFull(u32),

    #[error("Server queue is full: {0}")]
    ServerQueueIsFull(u32),

    #[error("No enough players")]
    NoEnoughPlayers,

    #[error("Server already joined: {0}")]
    ServerAlreadyJoined(String),

    #[error("Player not in game")]
    PlayerNotInGame,

    #[error("Malformed game event")]
    MalformedData(String),

    #[error("Malformed address")]
    MalformedAddress,

    #[error("Invalid randomness assignment")]
    InvalidRandomnessAssignment,

    #[error("Invalid randomness revealing")]
    InvalidRandomnessRevealing,

    #[error("Invalid random id")]
    InvalidRandomId,

    #[error("Custom error")]
    Custom(String),

    #[error("Server account not found")]
    ServerAccountNotFound,

    #[error("Player profile not found")]
    PlayerProfileNotFound,

    #[error("Game account not found")]
    GameAccountNotFound,

    #[error("Game bundle not found")]
    GameBundleNotFound,

    #[error("Server account exists")]
    ServerAccountExists,

    #[error("Registration not found")]
    RegistrationNotFound,

    #[error("Rpc error: {0}")]
    RpcError(String),

    #[error("Invalid chain name")]
    InvalidChainName,

    #[error("Invalid player address")]
    InvalidPlayerAddress,

    #[error("Invalid player status")]
    InvalidPlayerStatus,

    #[error("Game not loaded")]
    GameNotLoaded,

    #[error("Malformed endpoint")]
    MalformedEndpoint,

    #[error("Malformed game bundle")]
    MalformedGameBundle,

    #[error("Malformed game account")]
    MalformedGameAccount,

    #[error("Deserialize error")]
    DeserializeError,

    #[error("Config missing")]
    ConfigMissing,

    #[error("Transactor config missing")]
    TransactorConfigMissing,

    #[error("Can't leave")]
    CantLeave,

    #[error("Randomization error: {0}")]
    RandomizationError(String),

    #[error("Crypto error: {0}")]
    CryptoError(String),

    #[error("Duplicated event dispatching")]
    DuplicatedEventDispatching,

    #[error("Invalid amount")]
    InvalidAmount,

    #[error("Not allowed in custom handler")]
    NotAllowedInCustomHandler,

    #[error("Game not served")]
    GameNotServed,

    #[error("Game is not empty")]
    GameIsNotEmpty,

    #[error("Can't find transactor")]
    CantFindTransactor,

    #[error("Invalid transactor address")]
    InvalidTransactorAddress,

    #[error("Failed to load on-chain server account, please register first")]
    ServerAccountMissing,

    #[error("Initialization transport failed: {0}")]
    TransportError(String),

    #[error("Initializing instruction failed: {0}")]
    InitInstructionFailed(String),

    #[error("Initialize rpc client error: {0}")]
    InitializeRpcClientError(String),

    #[error("Internal error: {0}")]
    InternalError(String),

    #[error("Missing secret")]
    MissingSecret,

    #[error("Invalid secret")]
    InvalidSecret,

    #[error("Invalid decrypted value: {0}")]
    InvalidDecryptedValue(String),

    #[error("Decryption failed")]
    DecryptionFailed,

    #[error("Invalid key index")]
    InvalidKeyIndex,

    #[error("Invalid ciphertexts size, expect: {0}, got: {1}")]
    InvalidCiphertextsSize(u32, u32),

    #[error("Invalid max players")]
    InvalidMaxPlayers,

    #[error("JSON parse error")]
    JsonParseError,

    #[error("Signature verification failed")]
    SignatureVerificationFailed,

    #[error("Invalid Settle: {0}")]
    InvalidSettle(String),

    #[error("IO Error: {0}")]
    IoError(String),

    #[error("Not supported in validator mode")]
    NotSupportedInValidatorMode,

    #[error("Invalid voter: {0}")]
    InvalidVoter(String),

    #[error("Invalid votee: {0}")]
    InvalidVotee(String),

    #[error("Duplicated vote")]
    DuplicatedVote,

    #[error("Transaction expired")]
    TransactionExpired,

    #[error("Event ignored")]
    EventIgnored,

    #[error("Wallet not connected")]
    WalletNotConnected,

    #[error("Invalid custom event")]
    InvalidCustomEvent,

    #[error("Invalid decision id")]
    InvalidDecisionId,

    #[error("Answer not available")]
    AnswerNotAvailable,

    #[error("Missing decision secret: {0}")]
    MissingDecisionSecret(DecisionId),

    #[error("Invalid decision answer")]
    InvalidDecisionAnswer,

    #[error("Invalid decision owner")]
    InvalidDecisionOwner,

    #[error("Invalid decision status")]
    InvalidDecisionStatus,

    #[error("Duplicated secret share")]
    DuplicatedSecretShare,

    #[error("Serialization error")]
    SerializationError,

    #[error("Wasm initialization error: {0}")]
    WasmInitializationError(String),

    #[error("Wasm execution error: {0}")]
    WasmExecutionError(String),

    #[error("Wasm memory overflow")]
    WasmMemoryOverflow,

    #[error("Invalid checkpoint")]
    InvalidCheckpoint,

    #[error("Duplicated initialization")]
    DuplicatedInitialization,

    #[error("Randomness is not revealed")]
    RandomnessNotRevealed,

    #[error("Random state not found: {0}")]
    RandomStateNotFound(RandomId),

    #[error("Wasm execution error: {0}")]
    HandleError(HandleError),

    #[error("Invalid recipient slot params")]
    InvalidRecipientSlotParams,

    #[error("Cannot settle or transfer without checkpoint")]
    SettleWithoutCheckpoint,
}

#[cfg(feature = "serde")]
impl From<serde_json::Error> for Error {
    fn from(e: serde_json::Error) -> Self {
        Error::MalformedData(e.to_string())
    }
}

impl From<std::io::Error> for Error {
    fn from(e: std::io::Error) -> Self {
        Error::IoError(e.to_string())
    }
}

pub type Result<T> = std::result::Result<T, Error>;

#[derive(Error, Debug, BorshDeserialize, BorshSerialize, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum HandleError {
    #[error("Custom error: {0}")]
    Custom(String),

    #[error("No enough players")]
    NoEnoughPlayers,

    #[error("Invalid player")]
    InvalidPlayer,

    #[error("Can't leave game")]
    CantLeave,

    #[error("Invalid amount")]
    InvalidAmount,

    #[error("Malformed game account data")]
    MalformedGameAccountData,

    #[error("Malformed checkpoint data")]
    MalformedCheckpointData,

    #[error("Malformed custom event")]
    MalformedCustomEvent,

    #[error("Serialization error")]
    SerializationError,

    #[error("No enough servers")]
    NoEnoughServers,

    #[error("Internal error: {message:?}")]
    InternalError { message: String },
}

impl From<crate::error::Error> for HandleError {
    fn from(value: crate::error::Error) -> Self {
        HandleError::InternalError {
            message: value.to_string(),
        }
    }
}

impl From<HandleError> for Error {
    fn from(value: HandleError) -> Self {
        Error::HandleError(value)
    }
}

pub type HandleResult<T> = std::result::Result<T, HandleError>;