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