serial_settings/
interface.rs

1/// Wrapper type for a "best effort" serial interface.
2///
3/// # Note
4/// Overflows of the output are silently ignored.
5pub struct BestEffortInterface<T>(T);
6
7impl<T> BestEffortInterface<T>
8where
9    T: embedded_io::Write
10        + embedded_io::WriteReady
11        + embedded_io::Read
12        + embedded_io::ReadReady,
13{
14    /// Construct an interface where overflows and errors when writing on the output are silently
15    /// ignored.
16    pub fn new(interface: T) -> Self {
17        Self(interface)
18    }
19
20    /// Get access to the inner (wrapped) interface
21    pub fn inner(&self) -> &T {
22        &self.0
23    }
24
25    /// Get mutable access to the inner (wrapped) interface
26    pub fn inner_mut(&mut self) -> &mut T {
27        &mut self.0
28    }
29}
30
31impl<T> embedded_io::Write for BestEffortInterface<T>
32where
33    T: embedded_io::Write + embedded_io::WriteReady,
34{
35    fn write(&mut self, buf: &[u8]) -> Result<usize, T::Error> {
36        if let Ok(true) = self.0.write_ready() {
37            self.0.write(buf)
38        } else {
39            Ok(buf.len()) // discard!
40        }
41    }
42
43    fn flush(&mut self) -> Result<(), Self::Error> {
44        Ok(())
45    }
46}
47
48impl<T> embedded_io::ErrorType for BestEffortInterface<T>
49where
50    T: embedded_io::ErrorType,
51{
52    type Error = <T as embedded_io::ErrorType>::Error;
53}
54
55impl<T> embedded_io::Read for BestEffortInterface<T>
56where
57    T: embedded_io::Read,
58{
59    fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
60        self.0.read(buf)
61    }
62}
63
64impl<T> embedded_io::ReadReady for BestEffortInterface<T>
65where
66    T: embedded_io::ReadReady,
67{
68    fn read_ready(&mut self) -> Result<bool, Self::Error> {
69        self.0.read_ready()
70    }
71}