1 use { 2 failure::{Backtrace, Fail}, 3 rtmp::{ 4 amf0::errors::Amf0WriteError, cache::errors::MetadataError, session::errors::SessionError, 5 }, 6 std::fmt, 7 tokio::sync::broadcast::error::RecvError, 8 xflv::errors::FlvDemuxerError, 9 xmpegts::errors::MpegTsError, 10 }; 11 12 #[derive(Debug)] 13 pub struct ServerError { 14 pub value: ServerErrorValue, 15 } 16 17 #[derive(Debug, Fail)] 18 pub enum ServerErrorValue { 19 #[fail(display = "server error")] 20 Error, 21 } 22 #[derive(Debug)] 23 pub struct MediaError { 24 pub value: MediaErrorValue, 25 } 26 27 #[derive(Debug, Fail)] 28 pub enum MediaErrorValue { 29 #[fail(display = "server error")] 30 Error, 31 #[fail(display = "session error:{}", _0)] 32 SessionError(#[cause] SessionError), 33 #[fail(display = "amf write error:{}", _0)] 34 Amf0WriteError(#[cause] Amf0WriteError), 35 #[fail(display = "metadata error:{}", _0)] 36 MetadataError(#[cause] MetadataError), 37 #[fail(display = "flv demuxer error:{}", _0)] 38 FlvDemuxerError(#[cause] FlvDemuxerError), 39 #[fail(display = "mpegts error:{}", _0)] 40 MpegTsError(#[cause] MpegTsError), 41 #[fail(display = "write file error:{}", _0)] 42 IOError(#[cause] std::io::Error), 43 } 44 45 impl From<SessionError> for MediaError { 46 fn from(error: SessionError) -> Self { 47 MediaError { 48 value: MediaErrorValue::SessionError(error), 49 } 50 } 51 } 52 53 impl From<FlvDemuxerError> for MediaError { 54 fn from(error: FlvDemuxerError) -> Self { 55 MediaError { 56 value: MediaErrorValue::FlvDemuxerError(error), 57 } 58 } 59 } 60 61 impl From<MpegTsError> for MediaError { 62 fn from(error: MpegTsError) -> Self { 63 MediaError { 64 value: MediaErrorValue::MpegTsError(error), 65 } 66 } 67 } 68 69 impl From<Amf0WriteError> for MediaError { 70 fn from(error: Amf0WriteError) -> Self { 71 MediaError { 72 value: MediaErrorValue::Amf0WriteError(error), 73 } 74 } 75 } 76 77 impl From<MetadataError> for MediaError { 78 fn from(error: MetadataError) -> Self { 79 MediaError { 80 value: MediaErrorValue::MetadataError(error), 81 } 82 } 83 } 84 85 impl From<std::io::Error> for MediaError { 86 fn from(error: std::io::Error) -> Self { 87 MediaError { 88 value: MediaErrorValue::IOError(error), 89 } 90 } 91 } 92 93 impl fmt::Display for MediaError { 94 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 95 fmt::Display::fmt(&self.value, f) 96 } 97 } 98 99 impl Fail for MediaError { 100 fn cause(&self) -> Option<&dyn Fail> { 101 self.value.cause() 102 } 103 104 fn backtrace(&self) -> Option<&Backtrace> { 105 self.value.backtrace() 106 } 107 } 108 109 pub struct HlsError { 110 pub value: HlsErrorValue, 111 } 112 113 #[derive(Debug, Fail)] 114 pub enum HlsErrorValue { 115 #[fail(display = "hls error")] 116 Error, 117 #[fail(display = "session error:{}", _0)] 118 SessionError(#[cause] SessionError), 119 #[fail(display = "amf write error:{}", _0)] 120 Amf0WriteError(#[cause] Amf0WriteError), 121 #[fail(display = "metadata error:{}", _0)] 122 MetadataError(#[cause] MetadataError), 123 #[fail(display = "flv demuxer error:{}", _0)] 124 FlvDemuxerError(#[cause] FlvDemuxerError), 125 #[fail(display = "media error:{}", _0)] 126 MediaError(#[cause] MediaError), 127 #[fail(display = "receive error:{}", _0)] 128 RecvError(#[cause] RecvError), 129 } 130 impl From<RecvError> for HlsError { 131 fn from(error: RecvError) -> Self { 132 HlsError { 133 value: HlsErrorValue::RecvError(error), 134 } 135 } 136 } 137 138 impl From<MediaError> for HlsError { 139 fn from(error: MediaError) -> Self { 140 HlsError { 141 value: HlsErrorValue::MediaError(error), 142 } 143 } 144 } 145 146 impl From<SessionError> for HlsError { 147 fn from(error: SessionError) -> Self { 148 HlsError { 149 value: HlsErrorValue::SessionError(error), 150 } 151 } 152 } 153 154 impl From<FlvDemuxerError> for HlsError { 155 fn from(error: FlvDemuxerError) -> Self { 156 HlsError { 157 value: HlsErrorValue::FlvDemuxerError(error), 158 } 159 } 160 } 161 162 impl From<Amf0WriteError> for HlsError { 163 fn from(error: Amf0WriteError) -> Self { 164 HlsError { 165 value: HlsErrorValue::Amf0WriteError(error), 166 } 167 } 168 } 169 170 impl From<MetadataError> for HlsError { 171 fn from(error: MetadataError) -> Self { 172 HlsError { 173 value: HlsErrorValue::MetadataError(error), 174 } 175 } 176 } 177 178 impl fmt::Display for HlsError { 179 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 180 fmt::Display::fmt(&self.value, f) 181 } 182 } 183