pub trait Transport {
type Error;
fn write(&mut self, frame: &[u8]) -> Result<(), Self::Error>;
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error>;
}
#[cfg(feature = "std")]
pub struct MockTransport {
pub written: Vec<u8>,
pub rx_buf: std::collections::VecDeque<u8>,
}
#[cfg(feature = "std")]
impl MockTransport {
pub fn new() -> Self {
Self {
written: Vec::new(),
rx_buf: std::collections::VecDeque::new(),
}
}
pub fn enqueue_response(&mut self, frame: Vec<u8>) {
self.rx_buf.extend(frame);
}
}
#[cfg(feature = "std")]
impl Default for MockTransport {
fn default() -> Self {
Self::new()
}
}
#[cfg(feature = "std")]
impl Transport for MockTransport {
type Error = std::io::Error;
fn write(&mut self, frame: &[u8]) -> Result<(), Self::Error> {
self.written.extend_from_slice(frame);
Ok(())
}
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
let n = buf.len().min(self.rx_buf.len());
for slot in buf.iter_mut().take(n) {
*slot = self.rx_buf.pop_front().unwrap();
}
Ok(n)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn mock_write_and_read() {
let mut t = MockTransport::new();
t.enqueue_response(b"AZ=090 EL=045\r".to_vec());
t.write(b"C\r").unwrap();
assert_eq!(&t.written, b"C\r");
let mut buf = [0u8; 32];
let n = t.read(&mut buf).unwrap();
assert_eq!(&buf[..n], b"AZ=090 EL=045\r");
}
#[test]
fn mock_empty_read() {
let mut t = MockTransport::new();
let mut buf = [0u8; 8];
let n = t.read(&mut buf).unwrap();
assert_eq!(n, 0);
}
}