#![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(clippy::unwrap_used)]
use tinyklv::prelude::*; use tinyklv::dec::binary as decb; use tinyklv::enc::binary as encb; use tinyklv::dec::ber as decber; use tinyklv::enc::ber as encber;
#[derive(Klv, Debug, PartialEq)]
#[klv(
stream = &[u8],
sentinel = b"PROCESSCTL",
key(dec = decber::ber_oid::<u64>, enc = encber::ber_oid), // variable-width BER-OID keys
len(dec = decber::ber_length, enc = encber::ber_length), // variable-width BER lengths
)]
struct ProcessControl {
#[klv(
key = 0x01_u64,
dec = decb::u8,
enc = *encb::u8,
)]
device_class: u8,
#[klv(
key = 0x0100_u64,
dec = decb::be_u32,
enc = *encb::be_u32,
)]
set_point: u32,
#[klv(
key = 0x4001_u64,
dec = decb::be_u16,
enc = *encb::be_u16,
)]
alarm_code: u16,
}
fn main() {
let original = ProcessControl {
device_class: 0x05,
set_point: 75_000, alarm_code: 0x00FF, };
let frame = original.encode_frame();
let decoded = ProcessControl::decode_frame(
&mut frame.as_slice(),
).unwrap();
assert_eq!(decoded, original);
}