summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Müller <neikos@neikos.email>2024-03-27 16:18:41 +0100
committerMarcel Müller <neikos@neikos.email>2024-03-27 16:46:02 +0100
commita3ef3e7a02fb916f57981c22f24b02f5811141bc (patch)
treeeb11b76e42a74d80f2e75010a75fe96c5e52ae2c
parent745a86488c3bf4032d5b1715b4263c46d6d9998c (diff)
Use an actual error in MqttClientConnector::connect
Signed-off-by: Marcel Müller <neikos@neikos.email>
-rw-r--r--src/client.rs38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/client.rs b/src/client.rs
index 4f61cba..1cfc62e 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -11,6 +11,7 @@ use tokio_util::codec::Framed;
use crate::bytes::MqttBytes;
use crate::client_identifier::ClientIdentifier;
use crate::codecs::MqttPacketCodec;
+use crate::codecs::MqttPacketCodecError;
use crate::keep_alive::KeepAlive;
use crate::string::MqttString;
use crate::transport::MqttConnectTransport;
@@ -58,6 +59,21 @@ impl MqttWill {
}
}
+#[derive(Debug, thiserror::Error)]
+pub enum MqttClientConnectError {
+ #[error("An error occured while encoding or sending an MQTT Packet")]
+ Send(#[source] MqttPacketCodecError),
+
+ #[error("An error occured while decoding or receiving an MQTT Packet")]
+ Receive(#[source] MqttPacketCodecError),
+
+ #[error("The transport unexpectedly closed")]
+ TransportUnexpectedlyClosed,
+
+ #[error("The server sent a response with a protocol error: {reason}")]
+ ServerProtocolError { reason: &'static str },
+}
+
pub struct MqttClientConnector {
transport: MqttConnectTransport,
client_identifier: ClientIdentifier,
@@ -103,7 +119,8 @@ impl MqttClientConnector {
self
}
- pub async fn connect(self) -> Result<MqttClient, ()> {
+ pub async fn connect(self) -> Result<MqttClient, MqttClientConnectError> {
+ type Mcce = MqttClientConnectError;
let mut conn =
tokio_util::codec::Framed::new(MqttConnection::from(self.transport), MqttPacketCodec);
@@ -119,14 +136,17 @@ impl MqttClientConnector {
conn.send(mqtt_format::v5::packets::MqttPacket::Connect(conn_packet))
.await
- .map_err(|_| ())?;
+ .map_err(Mcce::Send)?;
let Some(maybe_connack) = conn.next().await else {
- return Err(());
+ return Err(Mcce::TransportUnexpectedlyClosed);
};
- let Ok(maybe_connack) = maybe_connack else {
- return Err(());
+ let maybe_connack = match maybe_connack {
+ Ok(maybe_connack) => maybe_connack,
+ Err(e) => {
+ return Err(Mcce::Receive(e));
+ }
};
let connack = loop {
@@ -138,11 +158,15 @@ impl MqttClientConnector {
auth
} else {
// MQTT-4.12.0-6
- return Err(());
+ return Err(Mcce::ServerProtocolError {
+ reason: "MQTT-4.12.0-6",
+ });
}
}
_ => {
- return Err(());
+ return Err(MqttClientConnectError::ServerProtocolError {
+ reason: "MQTT-3.1.4-5",
+ });
}
};