avr_tester/
read.rs

1use std::{array, iter};
2
3/// Object that can be read from, e.g. [`crate::Uart`].
4pub trait Reader {
5    /// Reads a byte from the AVR; when the buffer is empty, panics.
6    fn read_byte(&mut self) -> u8;
7
8    /// Reads a byte from the AVR; when the buffer is empty, returns `None`.
9    fn try_read_byte(&mut self) -> Option<u8>;
10}
11
12pub trait ReaderHelper {
13    fn read<T>(&mut self) -> T
14    where
15        T: Readable;
16}
17
18impl ReaderHelper for dyn Reader + '_ {
19    fn read<T>(&mut self) -> T
20    where
21        T: Readable,
22    {
23        T::read(self)
24    }
25}
26
27/// Value that can be retrieved from a [`Reader`].
28pub trait Readable {
29    fn read(rx: &mut dyn Reader) -> Self;
30}
31
32impl Readable for u8 {
33    fn read(rx: &mut dyn Reader) -> Self {
34        rx.read_byte()
35    }
36}
37
38impl Readable for Option<u8> {
39    fn read(rx: &mut dyn Reader) -> Self {
40        rx.try_read_byte()
41    }
42}
43
44impl<const N: usize> Readable for [u8; N] {
45    fn read(rx: &mut dyn Reader) -> Self {
46        array::from_fn(|_| rx.read())
47    }
48}
49
50impl Readable for Vec<u8> {
51    fn read(rx: &mut dyn Reader) -> Self {
52        iter::from_fn(|| rx.try_read_byte()).collect()
53    }
54}
55
56impl Readable for String {
57    fn read(rx: &mut dyn Reader) -> Self {
58        let bytes: Vec<u8> = Readable::read(rx);
59
60        String::from_utf8_lossy(&bytes).to_string()
61    }
62}