st7565 0.6.0

Driver for ST7565 based displays.
Documentation
use display_interface::{DataFormat::U8, DisplayError, WriteOnlyDataCommand};

#[derive(Copy, Clone, PartialEq, Eq, Debug)]
#[cfg_attr(all(target_arch = "arm", target_os = "none"), derive(defmt::Format))]
pub enum ExpectedAction<'a> {
    Command(&'a [u8]),
    Data(&'a [u8]),
}
use ExpectedAction::*;

pub struct DisplayMock<'a, 'b> {
    expected_actions: &'a [ExpectedAction<'b>],
}

impl DisplayMock<'_, '_> {
    pub fn with_expect<'a, 'b, T>(
        expected: &'a [ExpectedAction<'b>],
        f: impl FnOnce(&mut DisplayMock<'a, 'b>) -> T,
    ) -> T {
        let mut mock = DisplayMock {
            expected_actions: expected,
        };

        let result = f(&mut mock);

        assert!(
            mock.expected_actions.is_empty(),
            "Actions were expected, but did not happen: {:?}",
            mock.expected_actions
        );

        result
    }
}

impl WriteOnlyDataCommand for &mut DisplayMock<'_, '_> {
    fn send_commands(
        &mut self,
        data: display_interface::DataFormat<'_>,
    ) -> Result<(), DisplayError> {
        let actual = if let U8(actual) = data {
            Command(actual)
        } else {
            panic!("Only U8 data supported for now!")
        };

        let (expected, leftover) = self
            .expected_actions
            .split_first()
            .expect("No action was expected!");

        self.expected_actions = leftover;

        assert_eq!(expected, &actual, "Unexpected action received!");

        Ok(())
    }
    fn send_data(&mut self, data: display_interface::DataFormat<'_>) -> Result<(), DisplayError> {
        let actual = if let U8(actual) = data {
            Data(actual)
        } else {
            panic!("Only U8 data supported for now!")
        };

        let (expected, leftover) = self
            .expected_actions
            .split_first()
            .expect("No action was expected!");

        self.expected_actions = leftover;

        assert_eq!(expected, &actual, "Unexpected data received!");

        Ok(())
    }
}