use std::any::Any;
use thiserror::Error as ThisError;
use tokio::sync::mpsc;
use ccp_msr::MSRError;
use ccp_randomx::errors::RandomXError;
use cpu_utils::LogicalCoreId;
#[derive(ThisError, Debug)]
pub enum ProvingThreadSyncError {
#[error(transparent)]
RandomXError(#[from] RandomXError),
#[error(transparent)]
MSRError(#[from] MSRError),
#[error(transparent)]
ChannelError(#[from] anyhow::Error),
#[error("thread pinning to logical core {core_id} failed")]
ThreadPinFailed { core_id: LogicalCoreId },
}
#[derive(ThisError, Debug)]
pub enum ProvingThreadSyncFacadeError {
#[error("error happened while waiting the sync part to complete {0:?}")]
JoinError(Box<dyn Any + Send>),
#[error(transparent)]
ChannelError(#[from] anyhow::Error),
}
impl ProvingThreadSyncError {
pub fn channel_error(error_message: impl ToString) -> Self {
Self::ChannelError(anyhow::anyhow!(error_message.to_string()))
}
pub fn pinning_failed(core_id: LogicalCoreId) -> Self {
Self::ThreadPinFailed { core_id }
}
}
impl ProvingThreadSyncFacadeError {
pub(crate) fn join_error(error: Box<dyn Any + Send>) -> Self {
Self::JoinError(error)
}
}
impl<T> From<mpsc::error::SendError<T>> for ProvingThreadSyncError {
fn from(value: mpsc::error::SendError<T>) -> Self {
ProvingThreadSyncError::ChannelError(anyhow::anyhow!("prover channel error: {value}"))
}
}
impl From<mpsc::error::TryRecvError> for ProvingThreadSyncError {
fn from(value: mpsc::error::TryRecvError) -> Self {
ProvingThreadSyncError::ChannelError(anyhow::anyhow!("prover channel error: {value}"))
}
}
impl<T> From<mpsc::error::SendError<T>> for ProvingThreadSyncFacadeError {
fn from(value: mpsc::error::SendError<T>) -> Self {
ProvingThreadSyncFacadeError::ChannelError(anyhow::anyhow!("prover channel error: {value}"))
}
}