1use core::fmt;
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq)]
10pub enum ProtocolError {
11 EmptyFrame,
13 UnknownMessageType(u8),
15 InvalidLength {
17 message_type: u8,
18 expected: usize,
19 actual: usize,
20 },
21 InvalidHandSide(u8),
23}
24
25impl fmt::Display for ProtocolError {
26 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
27 match self {
28 Self::EmptyFrame => f.write_str("received an empty WebSocket frame"),
29 Self::UnknownMessageType(tag) => {
30 write!(f, "unknown message type byte 0x{tag:02x}")
31 }
32 Self::InvalidLength {
33 message_type,
34 expected,
35 actual,
36 } => write!(
37 f,
38 "message type 0x{message_type:02x}: expected {expected} payload bytes, got {actual}"
39 ),
40 Self::InvalidHandSide(byte) => {
41 write!(f, "invalid hand-side byte {byte} (expected 0 or 1)")
42 }
43 }
44 }
45}
46
47#[cfg(feature = "std")]
48impl std::error::Error for ProtocolError {}
49
50#[cfg(test)]
51mod tests {
52 use super::*;
53
54 #[test]
55 fn display_is_human_readable() {
56 assert_eq!(
58 ProtocolError::EmptyFrame.to_string(),
59 "received an empty WebSocket frame"
60 );
61 assert_eq!(
62 ProtocolError::UnknownMessageType(0xAB).to_string(),
63 "unknown message type byte 0xab"
64 );
65 assert_eq!(
66 ProtocolError::InvalidHandSide(7).to_string(),
67 "invalid hand-side byte 7 (expected 0 or 1)"
68 );
69 }
70}