xref: /xiu/protocol/rtmp/src/messages/errors.rs (revision c2f3fbfa)
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