1 use crate::amf0::errors::Amf0ReadError; 2 use crate::protocol_control_messages::errors::ProtocolControlMessageReaderError; 3 use crate::user_control_messages::errors::EventMessagesError; 4 use netio::bytes_errors::BytesReadError; 5 6 use failure::{Backtrace, Fail}; 7 use std::fmt; 8 9 #[derive(Debug, Fail)] 10 pub enum MessageErrorValue { 11 #[fail(display = "bytes read error: {}", _0)] 12 BytesReadError(BytesReadError), 13 #[fail(display = "unknow read state")] 14 UnknowReadState, 15 #[fail(display = "amf0 read error: {}", _0)] 16 Amf0ReadError(Amf0ReadError), 17 #[fail(display = "unknown message type")] 18 UnknowMessageType, 19 #[fail(display = "protocol control message read error: {}", _0)] 20 ProtocolControlMessageReaderError(ProtocolControlMessageReaderError), 21 #[fail(display = "user control message read error: {}", _0)] 22 EventMessagesError(EventMessagesError), 23 } 24 25 #[derive(Debug)] 26 pub struct MessageError { 27 pub value: MessageErrorValue, 28 } 29 30 impl From<MessageErrorValue> for MessageError { 31 fn from(val: MessageErrorValue) -> Self { 32 MessageError { value: val } 33 } 34 } 35 36 impl From<BytesReadError> for MessageError { 37 fn from(error: BytesReadError) -> Self { 38 MessageError { 39 value: MessageErrorValue::BytesReadError(error), 40 } 41 } 42 } 43 44 impl From<Amf0ReadError> for MessageError { 45 fn from(error: Amf0ReadError) -> Self { 46 MessageError { 47 value: MessageErrorValue::Amf0ReadError(error), 48 } 49 } 50 } 51 52 impl From<ProtocolControlMessageReaderError> for MessageError { 53 fn from(error: ProtocolControlMessageReaderError) -> Self { 54 MessageError { 55 value: MessageErrorValue::ProtocolControlMessageReaderError(error), 56 } 57 } 58 } 59 60 impl From<EventMessagesError> for MessageError { 61 fn from(error: EventMessagesError) -> Self { 62 MessageError { 63 value: MessageErrorValue::EventMessagesError(error), 64 } 65 } 66 } 67 68 impl fmt::Display for MessageError { 69 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 70 fmt::Display::fmt(&self.value, f) 71 } 72 } 73 74 impl Fail for MessageError { 75 fn cause(&self) -> Option<&dyn Fail> { 76 self.value.cause() 77 } 78 79 fn backtrace(&self) -> Option<&Backtrace> { 80 self.value.backtrace() 81 } 82 } 83