use { crate::{ amf0::errors::Amf0WriteError, cache::errors::CacheError, chunk::errors::{PackError, UnpackError}, handshake::errors::HandshakeError, messages::errors::MessageError, netconnection::errors::NetConnectionError, netstream::errors::NetStreamError, protocol_control_messages::errors::ControlMessagesError, user_control_messages::errors::EventMessagesError, }, bytesio::{bytes_errors::BytesWriteError, bytesio_errors::BytesIOError}, failure::{Backtrace, Fail}, std::fmt, streamhub::errors::ChannelError, tokio::sync::oneshot::error::RecvError, }; #[derive(Debug)] pub struct SessionError { pub value: SessionErrorValue, } #[derive(Debug, Fail)] pub enum SessionErrorValue { #[fail(display = "amf0 write error: {}", _0)] Amf0WriteError(#[cause] Amf0WriteError), #[fail(display = "bytes write error: {}", _0)] BytesWriteError(#[cause] BytesWriteError), // #[fail(display = "timeout error: {}", _0)] // TimeoutError(#[cause] Elapsed), #[fail(display = "unpack error: {}", _0)] UnPackError(#[cause] UnpackError), #[fail(display = "message error: {}", _0)] MessageError(#[cause] MessageError), #[fail(display = "control message error: {}", _0)] ControlMessagesError(#[cause] ControlMessagesError), #[fail(display = "net connection error: {}", _0)] NetConnectionError(#[cause] NetConnectionError), #[fail(display = "net stream error: {}", _0)] NetStreamError(#[cause] NetStreamError), #[fail(display = "event messages error: {}", _0)] EventMessagesError(#[cause] EventMessagesError), #[fail(display = "net io error: {}", _0)] BytesIOError(#[cause] BytesIOError), #[fail(display = "pack error: {}", _0)] PackError(#[cause] PackError), #[fail(display = "handshake error: {}", _0)] HandshakeError(#[cause] HandshakeError), #[fail(display = "cache error name: {}", _0)] CacheError(#[cause] CacheError), #[fail(display = "tokio: oneshot receiver err: {}", _0)] RecvError(#[cause] RecvError), #[fail(display = "streamhub channel err: {}", _0)] ChannelError(#[cause] ChannelError), #[fail(display = "amf0 count not correct error")] Amf0ValueCountNotCorrect, #[fail(display = "amf0 value type not correct error")] Amf0ValueTypeNotCorrect, #[fail(display = "stream hub event send error")] StreamHubEventSendErr, #[fail(display = "none frame data sender error")] NoneFrameDataSender, #[fail(display = "none frame data receiver error")] NoneFrameDataReceiver, #[fail(display = "send frame data error")] SendFrameDataErr, #[fail(display = "subscribe count limit is reached.")] SubscribeCountLimitReach, #[fail(display = "no app name error")] NoAppName, #[fail(display = "no media data can be received now.")] NoMediaDataReceived, #[fail(display = "session is finished.")] Finish, } impl From for SessionError { fn from(error: Amf0WriteError) -> Self { SessionError { value: SessionErrorValue::Amf0WriteError(error), } } } impl From for SessionError { fn from(error: BytesWriteError) -> Self { SessionError { value: SessionErrorValue::BytesWriteError(error), } } } // impl From for SessionError { // fn from(error: Elapsed) -> Self { // SessionError { // value: SessionErrorValue::TimeoutError(error), // } // } // } impl From for SessionError { fn from(error: UnpackError) -> Self { SessionError { value: SessionErrorValue::UnPackError(error), } } } impl From for SessionError { fn from(error: MessageError) -> Self { SessionError { value: SessionErrorValue::MessageError(error), } } } impl From for SessionError { fn from(error: ControlMessagesError) -> Self { SessionError { value: SessionErrorValue::ControlMessagesError(error), } } } impl From for SessionError { fn from(error: NetConnectionError) -> Self { SessionError { value: SessionErrorValue::NetConnectionError(error), } } } impl From for SessionError { fn from(error: NetStreamError) -> Self { SessionError { value: SessionErrorValue::NetStreamError(error), } } } impl From for SessionError { fn from(error: EventMessagesError) -> Self { SessionError { value: SessionErrorValue::EventMessagesError(error), } } } impl From for SessionError { fn from(error: BytesIOError) -> Self { SessionError { value: SessionErrorValue::BytesIOError(error), } } } impl From for SessionError { fn from(error: PackError) -> Self { SessionError { value: SessionErrorValue::PackError(error), } } } impl From for SessionError { fn from(error: HandshakeError) -> Self { SessionError { value: SessionErrorValue::HandshakeError(error), } } } impl From for SessionError { fn from(error: CacheError) -> Self { SessionError { value: SessionErrorValue::CacheError(error), } } } impl From for SessionError { fn from(error: RecvError) -> Self { SessionError { value: SessionErrorValue::RecvError(error), } } } impl From for SessionError { fn from(error: ChannelError) -> Self { SessionError { value: SessionErrorValue::ChannelError(error), } } } impl fmt::Display for SessionError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::Display::fmt(&self.value, f) } } impl Fail for SessionError { fn cause(&self) -> Option<&dyn Fail> { self.value.cause() } fn backtrace(&self) -> Option<&Backtrace> { self.value.backtrace() } }