From a3ef3e7a02fb916f57981c22f24b02f5811141bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=BCller?= Date: Wed, 27 Mar 2024 16:18:41 +0100 Subject: Use an actual error in MqttClientConnector::connect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcel Müller --- src/client.rs | 38 +++++++++++++++++++++++++++++++------- 1 file 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 { + pub async fn connect(self) -> Result { + 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", + }); } }; -- cgit v1.2.3