use std::fmt;
use crate::rctx::RCtxState;
#[derive(Debug)]
pub enum Error<E> {
ServerDisappeared,
OriginDisappeared,
ClientsDisappeared,
NoReply,
App(E)
}
impl<E> Error<E> {
pub fn into_apperr(self) -> Option<E> {
match self {
Self::App(e) => Some(e),
_ => None
}
}
pub fn unwrap_apperr(self) -> E {
match self {
Self::App(e) => e,
_ => panic!("Not an Error::App")
}
}
}
impl<E> std::error::Error for Error<E> where E: std::error::Error {}
impl<E> fmt::Display for Error<E>
where
E: std::error::Error
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::ServerDisappeared => write!(f, "Server disappeared"),
Self::OriginDisappeared => write!(f, "Requestor disappeared"),
Self::ClientsDisappeared => write!(f, "Clients disappeared"),
Self::NoReply => write!(f, "Server didn't reply"),
Self::App(err) => write!(f, "Application error; {err}")
}
}
}
impl<E> From<swctx::Error<RCtxState, E>> for Error<E> {
fn from(err: swctx::Error<RCtxState, E>) -> Self {
match err {
swctx::Error::Aborted(state) => match state {
RCtxState::Queued => Self::ServerDisappeared,
RCtxState::Active => Self::NoReply
},
swctx::Error::LostWaiter => Self::OriginDisappeared,
swctx::Error::App(e) => Self::App(e)
}
}
}