1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use uuid;

use crate::protocol::ProtocolId;
use crate::types::Descriptor;

#[derive(Debug, Display, From, Clone)]
pub enum AmqpParseError {
    #[display(fmt = "Loaded item size is invalid")]
    InvalidSize,
    #[display(fmt = "More data required during frame parsing: '{:?}'", "_0")]
    Incomplete(Option<usize>),
    #[from(ignore)]
    #[display(fmt = "Unexpected format code: '{}'", "_0")]
    InvalidFormatCode(u8),
    #[display(fmt = "Invalid value converting to char: {}", "_0")]
    InvalidChar(u32),
    #[display(fmt = "Unexpected descriptor: '{:?}'", "_0")]
    InvalidDescriptor(Descriptor),
    #[from(ignore)]
    #[display(fmt = "Unexpected frame type: '{:?}'", "_0")]
    UnexpectedFrameType(u8),
    #[from(ignore)]
    #[display(fmt = "Required field '{:?}' was omitted.", "_0")]
    RequiredFieldOmitted(&'static str),
    #[from(ignore)]
    #[display(fmt = "Unknown {:?} option.", "_0")]
    UnknownEnumOption(&'static str),
    UuidParseError(uuid::Error),
    Utf8Error(std::str::Utf8Error),
}

#[derive(Debug, Display, From)]
pub enum AmqpCodecError {
    ParseError(AmqpParseError),
    #[display(fmt = "bytes left unparsed at the frame trail")]
    UnparsedBytesLeft,
    #[display(fmt = "max inbound frame size exceeded")]
    MaxSizeExceeded,
    #[display(fmt = "Io error: {:?}", _0)]
    Io(Option<std::io::Error>),
}

impl Clone for AmqpCodecError {
    fn clone(&self) -> AmqpCodecError {
        match self {
            AmqpCodecError::ParseError(err) => AmqpCodecError::ParseError(err.clone()),
            AmqpCodecError::UnparsedBytesLeft => AmqpCodecError::UnparsedBytesLeft,
            AmqpCodecError::MaxSizeExceeded => AmqpCodecError::MaxSizeExceeded,
            AmqpCodecError::Io(_) => AmqpCodecError::Io(None),
        }
    }
}

impl From<std::io::Error> for AmqpCodecError {
    fn from(err: std::io::Error) -> AmqpCodecError {
        AmqpCodecError::Io(Some(err))
    }
}

#[derive(Debug, Display, From)]
pub enum ProtocolIdError {
    InvalidHeader,
    Incompatible,
    Unknown,
    #[display(fmt = "Expected {:?} protocol id, seen {:?} instead.", exp, got)]
    Unexpected {
        exp: ProtocolId,
        got: ProtocolId,
    },
    Disconnected,
    #[display(fmt = "io error: {:?}", "_0")]
    Io(std::io::Error),
}