use { failure::{Backtrace, Fail}, rtmp::{ amf0::errors::Amf0WriteError, cache::errors::MetadataError, session::errors::SessionError, }, std::fmt, streamhub::errors::ChannelError, tokio::sync::broadcast::error::RecvError, tokio::sync::oneshot::error::RecvError as OneshotRecvError, xflv::errors::FlvDemuxerError, xmpegts::errors::MpegTsError, }; #[derive(Debug)] pub struct ServerError { pub value: ServerErrorValue, } #[derive(Debug, Fail)] pub enum ServerErrorValue { #[fail(display = "server error")] Error, } #[derive(Debug)] pub struct MediaError { pub value: MediaErrorValue, } #[derive(Debug, Fail)] pub enum MediaErrorValue { #[fail(display = "server error")] Error, #[fail(display = "channel recv error")] ChannelRecvError, #[fail(display = "session error:{}", _0)] SessionError(#[cause] SessionError), #[fail(display = "amf write error:{}", _0)] Amf0WriteError(#[cause] Amf0WriteError), #[fail(display = "metadata error:{}", _0)] MetadataError(#[cause] MetadataError), #[fail(display = "flv demuxer error:{}", _0)] FlvDemuxerError(#[cause] FlvDemuxerError), #[fail(display = "mpegts error:{}", _0)] MpegTsError(#[cause] MpegTsError), #[fail(display = "write file error:{}", _0)] IOError(#[cause] std::io::Error), } impl From for MediaError { fn from(error: SessionError) -> Self { MediaError { value: MediaErrorValue::SessionError(error), } } } impl From for MediaError { fn from(error: FlvDemuxerError) -> Self { MediaError { value: MediaErrorValue::FlvDemuxerError(error), } } } impl From for MediaError { fn from(error: MpegTsError) -> Self { MediaError { value: MediaErrorValue::MpegTsError(error), } } } impl From for MediaError { fn from(error: Amf0WriteError) -> Self { MediaError { value: MediaErrorValue::Amf0WriteError(error), } } } impl From for MediaError { fn from(error: MetadataError) -> Self { MediaError { value: MediaErrorValue::MetadataError(error), } } } impl From for MediaError { fn from(error: std::io::Error) -> Self { MediaError { value: MediaErrorValue::IOError(error), } } } impl fmt::Display for MediaError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::Display::fmt(&self.value, f) } } impl Fail for MediaError { fn cause(&self) -> Option<&dyn Fail> { self.value.cause() } fn backtrace(&self) -> Option<&Backtrace> { self.value.backtrace() } } pub struct HlsError { pub value: HlsErrorValue, } #[derive(Debug, Fail)] pub enum HlsErrorValue { #[fail(display = "hls error")] Error, #[fail(display = "channel recv error")] ChannelRecvError, #[fail(display = "channel error:{}", _0)] ChannelError(#[cause] ChannelError), #[fail(display = "session error:{}", _0)] SessionError(#[cause] SessionError), #[fail(display = "amf write error:{}", _0)] Amf0WriteError(#[cause] Amf0WriteError), #[fail(display = "metadata error:{}", _0)] MetadataError(#[cause] MetadataError), #[fail(display = "flv demuxer error:{}", _0)] FlvDemuxerError(#[cause] FlvDemuxerError), #[fail(display = "media error:{}", _0)] MediaError(#[cause] MediaError), #[fail(display = "receive error:{}", _0)] RecvError(#[cause] RecvError), #[fail(display = "tokio: oneshot receiver err: {}", _0)] OneshotRecvError(#[cause] OneshotRecvError), } impl From for HlsError { fn from(error: RecvError) -> Self { HlsError { value: HlsErrorValue::RecvError(error), } } } impl From for HlsError { fn from(error: MediaError) -> Self { HlsError { value: HlsErrorValue::MediaError(error), } } } impl From for HlsError { fn from(error: SessionError) -> Self { HlsError { value: HlsErrorValue::SessionError(error), } } } impl From for HlsError { fn from(error: FlvDemuxerError) -> Self { HlsError { value: HlsErrorValue::FlvDemuxerError(error), } } } impl From for HlsError { fn from(error: Amf0WriteError) -> Self { HlsError { value: HlsErrorValue::Amf0WriteError(error), } } } impl From for HlsError { fn from(error: MetadataError) -> Self { HlsError { value: HlsErrorValue::MetadataError(error), } } } impl From for HlsError { fn from(error: ChannelError) -> Self { HlsError { value: HlsErrorValue::ChannelError(error), } } } impl From for HlsError { fn from(error: OneshotRecvError) -> Self { HlsError { value: HlsErrorValue::OneshotRecvError(error), } } } impl fmt::Display for HlsError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::Display::fmt(&self.value, f) } }