pub trait CANRead {
fn data(&self) -> &[u8];
fn dlc(&self) -> usize;
}
pub trait CANWrite: CANRead {
fn mut_data(&mut self) -> &mut [u8];
}
impl CANRead for Vec<u8> {
fn data(&self) -> &[u8] {
self.as_slice()
}
fn dlc(&self) -> usize {
self.len()
}
}
impl CANWrite for Vec<u8> {
fn mut_data(&mut self) -> &mut [u8] {
self.as_mut_slice()
}
}
impl CANRead for &[u8] {
fn data(&self) -> &[u8] {
self
}
fn dlc(&self) -> usize {
self.len()
}
}
impl CANRead for &mut [u8] {
fn data(&self) -> &[u8] {
self
}
fn dlc(&self) -> usize {
self.len()
}
}
impl CANWrite for &mut [u8] {
fn mut_data(&mut self) -> &mut [u8] {
self
}
}
impl<const N: usize> CANRead for [u8; N] {
fn data(&self) -> &[u8] {
self.as_ref()
}
fn dlc(&self) -> usize {
self.len()
}
}
impl<const N: usize> CANWrite for [u8; N] {
fn mut_data(&mut self) -> &mut [u8] {
self.as_mut()
}
}
#[cfg(test)]
mod tests {
use super::CANRead;
#[test]
fn test_001() {
for i in 0..8 {
let mut v = Vec::new();
for j in 0..i {
v.push(j);
}
assert_eq!(CANRead::dlc(&v), i as usize);
}
}
#[test]
fn test_002() {
for i in 0..8 {
let mut v = Vec::new();
for j in 0..i {
v.push(j);
}
assert_eq!(CANRead::data(&v), v.as_slice());
}
}
}