use channels::serdes::Cbor;
use thiserror::Error;
use tokio::sync::mpsc;
use crate::{event::EventData, util::CenterError};
#[derive(Debug, Error)]
pub enum TryFromEventError {
#[error("Deserialize error: {0}")]
Deserialize(ciborium::value::Error),
#[error("Tag error: {0} != {1}")]
TagError(String, String),
#[error("?")]
Infallible,
#[error("Invalid event: {0}")]
InvalidEvent(String),
}
impl From<String> for TryFromEventError {
fn from(value: String) -> Self {
TryFromEventError::InvalidEvent(value)
}
}
#[derive(Debug, Error)]
pub enum CallSubscribeError {
#[error("TryFrom error: {0}")]
TryFrom(TryFromEventError),
#[error("Send event error: {0}")]
SendEvent(tokio::sync::mpsc::error::SendError<EventData>),
#[error("CallSubscribe error: {0}")]
Other(String),
#[error("Procedure call error: {0}")]
ProcedureCall(String),
}
impl From<TryFromEventError> for CallSubscribeError {
fn from(value: TryFromEventError) -> Self {
CallSubscribeError::TryFrom(value)
}
}
impl From<ciborium::value::Error> for CallSubscribeError {
fn from(value: ciborium::value::Error) -> Self {
CallSubscribeError::TryFrom(TryFromEventError::Deserialize(value))
}
}
impl From<tokio::sync::mpsc::error::SendError<EventData>> for CallSubscribeError {
fn from(value: tokio::sync::mpsc::error::SendError<EventData>) -> Self {
CallSubscribeError::SendEvent(value)
}
}
impl From<tokio::sync::oneshot::error::RecvError> for CallSubscribeError {
fn from(value: tokio::sync::oneshot::error::RecvError) -> Self {
CallSubscribeError::ProcedureCall(value.to_string())
}
}
impl From<tokio::sync::oneshot::error::TryRecvError> for CallSubscribeError {
fn from(value: tokio::sync::oneshot::error::TryRecvError) -> Self {
CallSubscribeError::ProcedureCall(value.to_string())
}
}
impl From<String> for CallSubscribeError {
fn from(value: String) -> Self {
CallSubscribeError::Other(value)
}
}
type CborSeError = <Cbor as channels::serdes::Serializer<EventData>>::Error;
#[derive(Debug, Error)]
pub enum BusSendError<W> {
Send(channels::error::SendError<CborSeError, W>),
Serialize(ciborium::value::Error),
}
impl<W> From<channels::error::SendError<CborSeError, W>> for BusSendError<W> {
fn from(value: channels::error::SendError<CborSeError, W>) -> Self {
BusSendError::Send(value)
}
}
impl<W> From<ciborium::value::Error> for BusSendError<W> {
fn from(value: ciborium::value::Error) -> Self {
BusSendError::Serialize(value)
}
}
type CborDeError = <Cbor as channels::serdes::Deserializer<EventData>>::Error;
#[derive(Debug, Error)]
pub enum BusRecvError<R> {
Recv(channels::error::RecvError<CborDeError, R>),
BoardcastRecv(tokio::sync::broadcast::error::RecvError),
BoardcastSend(tokio::sync::broadcast::error::SendError<EventData>),
}
impl<R> From<tokio::sync::broadcast::error::RecvError> for BusRecvError<R> {
fn from(value: tokio::sync::broadcast::error::RecvError) -> Self {
BusRecvError::BoardcastRecv(value)
}
}
impl<R> From<tokio::sync::broadcast::error::SendError<EventData>> for BusRecvError<R> {
fn from(value: tokio::sync::broadcast::error::SendError<EventData>) -> Self {
BusRecvError::BoardcastSend(value)
}
}
impl<R> From<channels::error::RecvError<CborDeError, R>> for BusRecvError<R> {
fn from(value: channels::error::RecvError<CborDeError, R>) -> Self {
BusRecvError::Recv(value)
}
}
#[derive(Debug, Error)]
pub enum BusError<W, R> {
BusSend(BusSendError<W>),
CallSubscribe(CallSubscribeError),
SendError(mpsc::error::SendError<EventData>),
BusRecv(BusRecvError<R>),
}
impl<W, R> From<BusSendError<W>> for BusError<W, R> {
fn from(value: BusSendError<W>) -> Self {
BusError::BusSend(value)
}
}
impl<W, R> From<CallSubscribeError> for BusError<W, R> {
fn from(value: CallSubscribeError) -> Self {
BusError::CallSubscribe(value)
}
}
impl<W, R> From<mpsc::error::SendError<EventData>> for BusError<W, R> {
fn from(value: mpsc::error::SendError<EventData>) -> Self {
BusError::SendError(value)
}
}
impl<W, R> From<BusRecvError<R>> for BusError<W, R> {
fn from(value: BusRecvError<R>) -> Self {
BusError::BusRecv(value)
}
}
impl<W, R> From<CenterError<R>> for BusError<W, R> {
fn from(value: CenterError<R>) -> Self {
match value {
CenterError::Left(e) => BusError::SendError(e),
CenterError::Right(e) => BusError::BusRecv(e),
}
}
}
pub use channels::error::*;
pub use ciborium::value::Error as CborValueError;