use std::any::Any;
use thiserror::Error as ThisError;
use tokio::sync::mpsc;
use crate::cu::proving_thread::sync::ProvingThreadSyncFacadeError;
use ccp_msr::MSRError;
#[derive(ThisError, Debug)]
pub enum ProvingThreadAsyncError {
#[error(transparent)]
ChannelError(#[from] anyhow::Error),
#[error(transparent)]
SyncThreadError(#[from] ProvingThreadSyncFacadeError),
#[error("error happened while waiting the sync part to complete {0:?}")]
JoinThreadFailed(Box<dyn Any + Send>),
#[error(transparent)]
MsrError(#[from] MSRError),
}
impl ProvingThreadAsyncError {
pub fn channel_error(error_message: impl ToString) -> Self {
Self::ChannelError(anyhow::anyhow!(error_message.to_string()))
}
pub fn join_error(error: Box<dyn Any + Send>) -> Self {
Self::JoinThreadFailed(error)
}
}
impl<T> From<mpsc::error::SendError<T>> for ProvingThreadAsyncError {
fn from(value: mpsc::error::SendError<T>) -> Self {
ProvingThreadAsyncError::channel_error(anyhow::anyhow!("prover channel error: {value}"))
}
}