use bytes::BytesMut;
pub trait Encoder<Item = Self> {
type Error;
fn encode(item: &Item, buf: &mut BytesMut) -> Result<(), Self::Error>;
fn size_of(item: &Item) -> usize;
}
#[cfg(test)]
mod tests {
use bytes::Bytes;
use crate as recode;
use crate::{codec::LengthPrefixed, util::EncoderExt, Encoder};
#[test]
fn basic_test() {
#[derive(Encoder)]
#[recode(encoder(buffer_name = "buf", error = "crate::Error"))]
struct TestType {
age: u32,
salary: u64,
#[recode(encoder(with = "LengthPrefixed::<u8>"))]
first_name: Bytes,
#[recode(encoder(with = "LengthPrefixed::<u16>"))]
last_name: Bytes,
#[recode(encoder(with = "LengthPrefixed::<u32>"))]
image: Bytes,
}
const IMAGE_BUF: [u8; 32] = [
0xBA, 0x3E, 0x9D, 0x6B, 0xAE, 0xF5, 0x91, 0xCC, 0xE2, 0xF0, 0xCB,
0x4F, 0xBB, 0x5B, 0x2B, 0xBE, 0xA7, 0xF4, 0x9D, 0xFB, 0x87, 0x43,
0x0E, 0xDF, 0x30, 0x6F, 0x7D, 0x6E, 0x22, 0xAB, 0xCC, 0x47,
];
let test_item = TestType {
age: 0x01234567,
salary: 0x1122334455667788,
first_name: "ayman".into(),
last_name: "القاضي".into(),
image: IMAGE_BUF.as_ref().into(),
};
let mut buf = bytes::BytesMut::new();
assert_eq!(test_item.age.size(), 4);
assert_eq!(test_item.salary.size(), 8);
assert_eq!(LengthPrefixed::<u8>::size_of(&test_item.first_name), 1 + 5);
assert_eq!(
LengthPrefixed::<u16>::size_of(&test_item.last_name),
2 + 12
);
assert_eq!(LengthPrefixed::<u32>::size_of(&test_item.image), 4 + 32);
assert_eq!(test_item.size(), 4 + 8 + (1 + 5) + (2 + 12) + (4 + 32));
TestType::encode(&test_item, &mut buf).unwrap();
const BUF: [u8; 68] = [
0x01, 0x23, 0x45, 0x67, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
0x05, b'a', b'y', b'm', b'a', b'n',
0x00, 0x0C, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x82, 0xD8, 0xA7, 0xD8,
0xB6, 0xD9, 0x8A,
0x00, 0x00, 0x00, 0x20, 0xBA, 0x3E, 0x9D, 0x6B, 0xAE, 0xF5, 0x91,
0xCC, 0xE2, 0xF0, 0xCB, 0x4F, 0xBB, 0x5B, 0x2B, 0xBE, 0xA7, 0xF4,
0x9D, 0xFB, 0x87, 0x43, 0x0E, 0xDF, 0x30, 0x6F, 0x7D, 0x6E, 0x22,
0xAB, 0xCC, 0x47,
];
assert_eq!(buf, BUF.as_ref());
}
}