mqtt_proto/common/
error.rs1use alloc::string::String;
2
3use embedded_io::ReadExactError;
4use thiserror::Error;
5
6use crate::Protocol;
7
8#[derive(Error, Debug, Clone, PartialEq, Eq)]
10pub enum Error {
11 #[error("invalid remaining length")]
13 InvalidRemainingLength,
14
15 #[error("empty subscription")]
17 EmptySubscription,
18
19 #[error("packet identifier is 0")]
21 ZeroPid,
22
23 #[error("invalid qos: `{0}`")]
25 InvalidQos(u8),
26
27 #[error("invalid connect flags: `{0}`")]
29 InvalidConnectFlags(u8),
30
31 #[error("invalid connack flags: `{0}`")]
33 InvalidConnackFlags(u8),
34
35 #[error("invalid connect return code: `{0}`")]
37 InvalidConnectReturnCode(u8),
38
39 #[error("invalid protocol: {0}, {1}")]
41 InvalidProtocol(String, u8),
42
43 #[error("unexpected protocol version: `{0}`")]
45 UnexpectedProtocol(Protocol),
46
47 #[error("invalid header")]
49 InvalidHeader,
50
51 #[error("invalid variable byte integer")]
53 InvalidVarByteInt,
54
55 #[error("invalid topic name: {0}")]
57 InvalidTopicName(String),
58
59 #[error("invalid topic filter: {0}")]
61 InvalidTopicFilter(String),
62
63 #[error("invalid string")]
65 InvalidString,
66
67 #[error("io error: {0:?}")]
69 IoError(IoErrorKind),
70}
71
72#[derive(Debug, Clone, PartialEq, Eq)]
74pub enum IoErrorKind {
75 UnexpectedEof,
76 InvalidData,
77 WriteZero,
78 Other,
79}
80
81impl Error {
82 pub fn is_eof(&self) -> bool {
83 matches!(self, Error::IoError(IoErrorKind::UnexpectedEof))
84 }
85}
86
87impl<E: embedded_io::Error> From<E> for Error {
88 fn from(err: E) -> Error {
89 let kind = match err.kind() {
90 embedded_io::ErrorKind::InvalidData => IoErrorKind::InvalidData,
91 embedded_io::ErrorKind::WriteZero => IoErrorKind::WriteZero,
92 _ => IoErrorKind::Other,
93 };
94 Error::IoError(kind)
95 }
96}
97
98pub fn from_read_exact_error<E: Into<Error>>(e: ReadExactError<E>) -> Error {
99 match e {
100 ReadExactError::UnexpectedEof => Error::IoError(IoErrorKind::UnexpectedEof),
101 ReadExactError::Other(e) => e.into(),
102 }
103}
104
105#[cfg(feature = "std")]
106impl From<Error> for std::io::Error {
107 fn from(err: Error) -> std::io::Error {
108 match err {
109 Error::IoError(IoErrorKind::UnexpectedEof) => {
110 std::io::Error::new(std::io::ErrorKind::UnexpectedEof, "unexpected eof")
111 }
112 Error::IoError(IoErrorKind::InvalidData) => {
113 std::io::Error::new(std::io::ErrorKind::InvalidData, "invalid data")
114 }
115 Error::IoError(IoErrorKind::WriteZero) => {
116 std::io::Error::new(std::io::ErrorKind::WriteZero, "write zero")
117 }
118 Error::IoError(IoErrorKind::Other) => std::io::Error::other("other error"),
119 _ => std::io::Error::new(std::io::ErrorKind::InvalidData, "mqtt protocol error"),
120 }
121 }
122}