#![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(clippy::unwrap_used)]
use tinyklv::prelude::*; use tinyklv::dec::binary as decb; use tinyklv::enc::binary as encb;
#[derive(Klv, Debug, PartialEq)]
#[klv(
stream = &[u8],
key(dec = decb::u8, enc = encb::u8),
len(dec = decb::u8_as_usize, enc = encb::u8_from_usize),
)]
struct Heartbeat {
#[klv(
key = 0x01,
dec = decb::u8,
enc = *encb::u8,
)]
sequence: u8,
#[klv(
key = 0x02,
dec = decb::i8,
enc = *encb::i8,
)]
signal_dbm: Option<i8>,
#[klv(
key = 0x03,
dec = decb::u8,
enc = *encb::u8,
default = 100_u8,
)]
battery_pct: u8,
}
fn main() {
let thin_bytes: &[u8] = &[
0x01, 0x01, 42,
];
let decoded = Heartbeat::decode_value(
&mut &thin_bytes[..],
).unwrap();
assert_eq!(decoded.sequence, 42);
assert_eq!(decoded.signal_dbm, None);
assert_eq!(decoded.battery_pct, 100);
let full = Heartbeat {
sequence: 7,
signal_dbm: Some(-54),
battery_pct: 87,
};
let full_bytes = full.encode_value();
let full_decoded = Heartbeat::decode_value(
&mut full_bytes.as_slice(),
).unwrap();
assert_eq!(full_decoded, full);
let thin = Heartbeat { signal_dbm: None, ..full };
assert!(thin.encode_value().len() < full_bytes.len());
}