summaryrefslogtreecommitdiffstats
path: root/src/client.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/client.rs')
-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",
+ });
}
};