use embedded_io::Write;
pub trait Encode {
type Error: From<embedded_io::ErrorKind>;
fn encoded_size(&self) -> usize;
fn encode(&self, writer: &mut impl Write) -> Result<usize, Self::Error>;
}
#[cfg(test)]
mod tests {
use super::*;
use crate::write::write_u16_be;
#[derive(Debug)]
enum TestErr {
Io(embedded_io::ErrorKind),
}
impl From<embedded_io::ErrorKind> for TestErr {
fn from(kind: embedded_io::ErrorKind) -> Self {
TestErr::Io(kind)
}
}
struct Val(u16);
impl Encode for Val {
type Error = TestErr;
fn encoded_size(&self) -> usize {
2
}
fn encode(&self, writer: &mut impl embedded_io::Write) -> Result<usize, TestErr> {
Ok(write_u16_be(writer, self.0)?)
}
}
#[test]
fn encode_reports_size_and_writes_into_slice() {
let v = Val(0xABCD);
let mut buf = [0u8; 4];
let mut w: &mut [u8] = &mut buf;
let n = v.encode(&mut w).unwrap();
assert_eq!(n, v.encoded_size());
assert_eq!(&buf[..2], &[0xAB, 0xCD]);
}
#[test]
fn encode_into_too_small_slice_errors() {
let v = Val(0xABCD);
let mut buf = [0u8; 1];
let mut w: &mut [u8] = &mut buf;
let err = v.encode(&mut w).unwrap_err();
let TestErr::Io(kind) = err;
assert_eq!(kind, embedded_io::ErrorKind::WriteZero);
}
}