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(_)));
}
}