oca 0.2.0

An experiment with no_std
Documentation
use crate::ocp1::{
    parser::{self, Error},
    pdu::MessagePdu,
};

pub fn decode(input: &[u8]) -> Result<Option<(MessagePdu<'_>, &[u8])>, Error> {
    match parser::message_pdu(input) {
        Ok((message, leftover)) => Ok(Some((message, leftover))),
        Err(Error::IncompleteInput) => Ok(None),
        Err(err) => Err(err),
    }
}

#[cfg(test)]
mod tests {
    use {
        super::*,
        crate::{
            ocp1::{
                encoder::encode_messages,
                pdu::{Parameters, Response},
            },
            types::OcaStatus,
        },
        core::assert_matches,
    };

    #[test]
    fn decoding_empty_input() {
        assert_matches!(decode(&[]), Ok(None));
    }

    #[test]
    fn decoding_invalid_input() {
        assert_matches!(decode(&[0; 8]), Err(Error::InvalidSyncValue(_)));
    }

    #[test]
    fn decoding_incomplete_input() {
        let response = Response {
            handle: 100.into(),
            status: OcaStatus::Ok,
            parameters: Parameters {
                count: 1,
                parameters: b"foo",
            },
        };

        let mut buffer = [0_u8; 23];
        let encoded = encode_messages(&[response], &mut buffer).unwrap();

        assert_eq!(decode(&encoded[..8]).unwrap(), None);
        assert_eq!(decode(&encoded[..16]).unwrap(), None);
        assert_matches!(decode(encoded), Ok(Some(_)));
    }
}