#![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, Clone, Copy)]
#[klv(
stream = &[u8],
key(dec = decb::u8, enc = encb::u8),
len(dec = decb::u8_as_usize, enc = encb::u8_from_usize),
)]
struct EngineHealth {
#[klv(
key = 0x01,
dec = decb::be_u16,
enc = *encb::be_u16,
)]
rpm: u16,
#[klv(
key = 0x02,
dec = decb::be_u16,
enc = *encb::be_u16,
)]
coolant_temp_decideg: u16,
#[klv(
key = 0x03,
dec = decb::u8,
enc = *encb::u8,
)]
oil_pressure_kpa: u8,
}
#[derive(Klv, Debug, PartialEq)]
#[klv(
stream = &[u8],
sentinel = b"VEHICLE",
key(dec = decb::u8, enc = encb::u8),
len(dec = decb::u8_as_usize, enc = encb::u8_from_usize),
)]
struct VehicleStatus {
#[klv(
key = 0x01,
dec = decb::be_u32,
enc = *encb::be_u32,
)]
vehicle_id: u32,
#[klv(
key = 0x02,
dec = decb::be_f32,
enc = *encb::be_f32,
)]
speed_kmh: f32,
#[klv(
key = 0x03,
dec = EngineHealth::decode_value,
enc = EngineHealth::encode_value,
)]
engine: EngineHealth,
}
fn main() {
let original = VehicleStatus {
vehicle_id: 0xDEAD_C0DE,
speed_kmh: 112.5,
engine: EngineHealth {
rpm: 3_200,
coolant_temp_decideg: 900, oil_pressure_kpa: 185,
},
};
let frame = original.encode_frame();
let decoded = VehicleStatus::decode_frame(
&mut frame.as_slice(),
).unwrap();
assert_eq!(decoded.vehicle_id, original.vehicle_id);
assert!((decoded.speed_kmh - original.speed_kmh).abs() < 1e-4);
assert_eq!(decoded.engine, original.engine);
let inner_bytes = original.engine.encode_value();
let inner_decoded = EngineHealth::decode_value(
&mut inner_bytes.as_slice(),
).unwrap();
assert_eq!(inner_decoded, original.engine);
}