use tinyklv::dec::binary as decb;
use tinyklv::enc::binary as encb;
use tinyklv::prelude::*;
#[derive(Klv, Debug, PartialEq)]
#[klv(
stream = &[u8],
sentinel = b"\x01\x01",
key(dec = decb::u8, enc = encb::u8),
len(dec = decb::u8_as_usize, enc = encb::u8_from_usize),
)]
struct PacketA {
#[klv(
key = 0x01,
dec = decb::be_u16,
enc = *encb::be_u16,
)]
value: u16,
}
#[derive(Klv, Debug, PartialEq)]
#[klv(
stream = &[u8],
sentinel = b"\x02\x02",
key(dec = decb::u8, enc = encb::u8),
len(dec = decb::u8_as_usize, enc = encb::u8_from_usize),
)]
struct PacketB {
#[klv(
key = 0x01,
dec = decb::be_u32,
enc = *encb::be_u32,
)]
value: u32,
}
fn build_stream(a_val: u16, b_val: u32) -> Vec<u8> {
let a = PacketA { value: a_val };
let b = PacketB { value: b_val };
let mut stream = a.encode_frame();
stream.extend(b.encode_frame());
stream
}
#[test]
fn extract_packet_a_from_stream() {
let stream = build_stream(0x1234, 0xDEAD_BEEF);
let decoded = PacketA::decode_frame(&mut stream.as_slice()).unwrap();
assert_eq!(decoded.value, 0x1234);
}
#[test]
fn extract_packet_b_from_stream() {
let stream = build_stream(0x1234, 0xDEAD_BEEF);
let decoded = PacketB::decode_frame(&mut stream.as_slice()).unwrap();
assert_eq!(decoded.value, 0xDEAD_BEEF);
}
#[test]
fn both_packets_independent() {
let stream = build_stream(999, 123456);
let a = PacketA::decode_frame(&mut stream.as_slice()).unwrap();
let b = PacketB::decode_frame(&mut stream.as_slice()).unwrap();
assert_eq!(a.value, 999);
assert_eq!(b.value, 123456);
}
#[test]
fn packet_a_missing_sentinel_fails() {
let a_only = PacketA { value: 1 }.encode_frame();
assert!(PacketB::decode_frame(&mut a_only.as_slice()).is_err());
}