#![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(clippy::unwrap_used)]
use tinyklv::prelude::*; use tinyklv::dec::binary as decb; use tinyklv::dec::string as decs; use tinyklv::enc::binary as encb; use tinyklv::enc::string as encs; use tinyklv::dec::ber as decber; use tinyklv::enc::ber as encber;
#[derive(Klv, Debug, PartialEq)]
#[klv(
stream = &[u8],
sentinel = b"SENSORLOG",
key(dec = decber::ber_oid::<u64>, enc = encber::ber_oid),
len(dec = decber::ber_length, enc = encber::ber_length::<usize>), // BER length scales with payload size
)]
struct SensorLog {
#[klv(
key = 0x01_u64,
dec = decb::be_u32,
enc = *encb::be_u32,
)]
timestamp_s: u32,
#[klv(
key = 0x02_u64,
varlen = true,
dec = decs::to_string_utf8,
enc = &encs::from_string_utf8,
)]
annotation: String,
}
fn main() {
let small = SensorLog {
timestamp_s: 1_700_000_000,
annotation: String::from("OK"),
};
let small_frame = small.encode_frame();
let dec_small = SensorLog::decode_frame(
&mut small_frame.as_slice(),
).unwrap();
assert_eq!(dec_small, small);
let large = SensorLog {
timestamp_s: 1_700_000_001,
annotation: "X".repeat(200), };
let large_frame = large.encode_frame();
let dec_large = SensorLog::decode_frame(
&mut large_frame.as_slice(),
).unwrap();
assert_eq!(dec_large, large);
assert!(
large_frame.len() > small_frame.len(),
"long annotation must produce a longer frame",
);
}