karak-contracts 0.2.2

Karak Contracts
Documentation
use alloy::{
    providers::PendingTransactionError, rpc::json_rpc::ErrorPayload, sol,
    transports::TransportError,
};

use crate::{error::DecodeError, impl_decode_error};

sol!(
    #[allow(missing_docs)]
    #[sol(rpc)]
    Operator,
    "abi/Operator.json",
);

impl std::fmt::Debug for Operator::OperatorErrors {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Operator::OperatorErrors::AllVaultsNotUnstakedFromDSS(_) => {
                write!(f, "AllVaultsNotUnstakedFromDSS")
            }
            Operator::OperatorErrors::DSSHookCallReverted(_) => {
                write!(f, "DSSHookCallReverted")
            }
            Operator::OperatorErrors::InvalidQueuedStakeUpdateInput(_) => {
                write!(f, "InvalidQueuedStakeUpdateInput")
            }
            Operator::OperatorErrors::MaxDSSCapacityReached(_) => {
                write!(f, "MaxDSSCapacityReached")
            }
            Operator::OperatorErrors::NotEnoughGas(_) => {
                write!(f, "NotEnoughGas")
            }
            Operator::OperatorErrors::OperatorAlreadyRegisteredToDSS(_) => {
                write!(f, "OperatorAlreadyRegisteredToDSS")
            }
            Operator::OperatorErrors::OperatorNotValidatingForDSS(_) => {
                write!(f, "OperatorNotValidatingForDSS")
            }
            Operator::OperatorErrors::OperatorStakeUpdateDelayNotPassed(_) => {
                write!(f, "OperatorStakeUpdateDelayNotPassed")
            }
            Operator::OperatorErrors::PendingStakeUpdateRequest(_) => {
                write!(f, "PendingStakeUpdateRequest")
            }
            Operator::OperatorErrors::VaultAlreadyStakedInDSS(_) => {
                write!(f, "VaultAlreadyStakedInDSS")
            }
            Operator::OperatorErrors::VaultNotAChildVault(_) => {
                write!(f, "VaultNotAChildVault")
            }
            Operator::OperatorErrors::VaultNotStakedInDSS(_) => {
                write!(f, "VaultNotStakedInDSS")
            }
        }
    }
}

impl std::fmt::Display for Operator::OperatorErrors {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Operator::OperatorErrors::AllVaultsNotUnstakedFromDSS(_) => {
                write!(f, "All vaults not unstaked from DSS")
            }
            Operator::OperatorErrors::DSSHookCallReverted(_) => {
                write!(f, "DSS hook call reverted")
            }
            Operator::OperatorErrors::InvalidQueuedStakeUpdateInput(_) => {
                write!(f, "Invalid queued stake update input")
            }
            Operator::OperatorErrors::MaxDSSCapacityReached(_) => {
                write!(f, "Max DSS capacity reached")
            }
            Operator::OperatorErrors::NotEnoughGas(_) => {
                write!(f, "Not enough gas")
            }
            Operator::OperatorErrors::OperatorAlreadyRegisteredToDSS(_) => {
                write!(f, "Operator already registered to DSS")
            }
            Operator::OperatorErrors::OperatorNotValidatingForDSS(_) => {
                write!(f, "Operator not validating for DSS")
            }
            Operator::OperatorErrors::OperatorStakeUpdateDelayNotPassed(_) => {
                write!(f, "Operator stake update delay not passed")
            }
            Operator::OperatorErrors::PendingStakeUpdateRequest(_) => {
                write!(f, "Pending stake update request")
            }
            Operator::OperatorErrors::VaultAlreadyStakedInDSS(_) => {
                write!(f, "Vault already staked in DSS")
            }
            Operator::OperatorErrors::VaultNotAChildVault(_) => {
                write!(f, "Vault not a child vault")
            }
            Operator::OperatorErrors::VaultNotStakedInDSS(_) => {
                write!(f, "Vault not staked in DSS")
            }
        }
    }
}

impl_decode_error!(Operator::OperatorErrors);

#[derive(Debug, thiserror::Error)]
pub enum OperatorError<E: std::fmt::Debug> {
    #[error("Operator error: {0}")]
    Operator(Operator::OperatorErrors),
    #[error(transparent)]
    Inner(E),
}

impl From<ErrorPayload> for OperatorError<ErrorPayload> {
    fn from(value: ErrorPayload) -> Self {
        match Operator::OperatorErrors::decode_error(&value) {
            Some(error) => OperatorError::Operator(error),
            None => OperatorError::Inner(value),
        }
    }
}

impl From<TransportError> for OperatorError<TransportError> {
    fn from(value: TransportError) -> Self {
        match Operator::OperatorErrors::decode_error(&value) {
            Some(error) => OperatorError::Operator(error),
            _ => OperatorError::Inner(value),
        }
    }
}

impl From<alloy::contract::Error> for OperatorError<alloy::contract::Error> {
    fn from(value: alloy::contract::Error) -> Self {
        match Operator::OperatorErrors::decode_error(&value) {
            Some(error) => OperatorError::Operator(error),
            _ => OperatorError::Inner(value),
        }
    }
}

impl From<PendingTransactionError> for OperatorError<PendingTransactionError> {
    fn from(value: PendingTransactionError) -> Self {
        match Operator::OperatorErrors::decode_error(&value) {
            Some(error) => OperatorError::Operator(error),
            _ => OperatorError::Inner(value),
        }
    }
}