Skip to main content

mountain_mqtt/
embedded_io_async.rs

1use embedded_io::ReadReady;
2use embedded_io_async::{Read, Write};
3
4use crate::{
5    error::{PacketReadError, PacketWriteError},
6    packet_client::Connection,
7};
8
9/// Contains an instance of T with [Read], [Write] and [ReadReady].
10/// We implement [Connection] for this rather than T directly to avoid
11/// issues with conflicting implementations of external types T that
12/// could in future add [Read], [Write] and [ReadReady]
13pub struct ConnectionEmbedded<T>
14where
15    T: Read + Write + ReadReady,
16{
17    inner: T,
18}
19
20impl<T> ConnectionEmbedded<T>
21where
22    T: Read + Write + ReadReady,
23{
24    /// Create a new adapter
25    pub fn new(inner: T) -> Self {
26        ConnectionEmbedded { inner }
27    }
28
29    /// Consume the adapter, returning the inner object.
30    pub fn into_inner(self) -> T {
31        self.inner
32    }
33
34    /// Borrow the inner object.
35    pub fn inner(&self) -> &T {
36        &self.inner
37    }
38
39    /// Mutably borrow the inner object.
40    pub fn inner_mut(&mut self) -> &mut T {
41        &mut self.inner
42    }
43}
44
45impl<T> Connection for ConnectionEmbedded<T>
46where
47    T: Read + Write + ReadReady,
48{
49    async fn send(&mut self, buf: &[u8]) -> Result<(), PacketWriteError> {
50        self.inner
51            .write_all(buf)
52            .await
53            .map_err(|_| PacketWriteError::ConnectionSend)?;
54        self.inner
55            .flush()
56            .await
57            .map_err(|_| PacketWriteError::ConnectionSend)
58    }
59
60    async fn receive(&mut self, buf: &mut [u8]) -> Result<(), PacketReadError> {
61        self.inner
62            .read_exact(buf)
63            .await
64            .map_err(|_| PacketReadError::ConnectionReceive)
65    }
66
67    async fn receive_if_ready(&mut self, buf: &mut [u8]) -> Result<bool, PacketReadError> {
68        if self
69            .inner
70            .read_ready()
71            .map_err(|_| PacketReadError::ConnectionReceive)?
72        {
73            self.receive(buf).await?;
74            Ok(true)
75        } else {
76            Ok(false)
77        }
78    }
79}