serde_can 0.1.1

Convenient library for Serialize & deserialize CAN message
Documentation
use embedded_can::{Frame, Id};
use serde::{Deserialize, Serialize};

use crate::{from_bytes, to_bytes};

#[derive(Debug, thiserror_no_std::Error, PartialEq)]
pub enum Error {
    #[error("remote frame")]
    RemoteFrame,
    #[error("message too long")]
    MsgTooLong,
    #[error("serde error {0}")]
    SerdeErr(crate::Error),
}

pub fn from_frame<'a, T: Deserialize<'a>, F: Frame>(f: &'a F) -> Result<T, Error> {
    if f.is_remote_frame() {
        return Err(Error::RemoteFrame)
    }

    from_bytes::<T>(f.data()).map_err(Error::SerdeErr)
}

pub fn to_frame<T: Serialize, F: Frame, I: Into<Id>>(id: I, a: &T) -> Result<F, Error> {
    let data = to_bytes::<T>(a).map_err(Error::SerdeErr)?;

    match F::new(id, data.as_slice()) {
        Some(f) => Ok(f),
        None => Err(Error::MsgTooLong)
    }
}