pixtend 0.1.0

Rust library for the PiXtend V2L board
Documentation
use crate::error::PiXtendError;
use deku::prelude::*;

#[derive(Debug, DekuRead, DekuWrite)]
pub struct Retain {
    #[deku(count = "64")]
    pub storage: Vec<u8>,
}

impl Retain {
    pub fn set_retain_data(&mut self, mut data: Vec<u8>) -> Result<(), PiXtendError> {
        match data.len() {
            0..=64 => {
                data.resize(64, 0);
                self.storage = data;
            }
            _ => return Err(PiXtendError::InvalidRetainDataLength(data.len())),
        }

        Ok(())
    }
}

impl Default for Retain {
    fn default() -> Self {
        Self {
            storage: vec![0; 64],
        }
    }
}

#[test]
fn test_retain() {
    let data = vec![0x01; 64];
    let (_, retain) = Retain::from_bytes((&data, 0)).unwrap();
    assert_eq!(retain.storage, data);
    assert_eq!(retain.to_bytes().unwrap(), data);

    assert_eq!(Retain::default().to_bytes().unwrap(), vec![0x00; 64]);
}