Skip to main content

osdp/reply/
keypad.rs

1//! `osdp_KEYPAD` (`0x53`) — keypad data.
2//!
3//! # Spec: §7.12
4
5use crate::error::Error;
6use alloc::vec::Vec;
7
8/// `osdp_KEYPAD` body.
9#[derive(Debug, Clone, PartialEq, Eq)]
10pub struct Keypad {
11    /// Reader number.
12    pub reader: u8,
13    /// Number of digits in `digits`.
14    pub digit_count: u8,
15    /// Digits (ASCII; `0x7F` = clear, `0x0D` = enter).
16    pub digits: Vec<u8>,
17}
18
19impl Keypad {
20    /// Encode.
21    pub fn encode(&self) -> Result<Vec<u8>, Error> {
22        if self.digits.len() != self.digit_count as usize {
23            return Err(Error::MalformedPayload {
24                code: 0x53,
25                reason: "KEYPAD digit_count disagrees with digits",
26            });
27        }
28        let mut out = Vec::with_capacity(2 + self.digits.len());
29        out.push(self.reader);
30        out.push(self.digit_count);
31        out.extend_from_slice(&self.digits);
32        Ok(out)
33    }
34
35    /// Decode.
36    pub fn decode(data: &[u8]) -> Result<Self, Error> {
37        if data.len() < 2 {
38            return Err(Error::MalformedPayload {
39                code: 0x53,
40                reason: "KEYPAD requires at least 2 bytes",
41            });
42        }
43        let digit_count = data[1];
44        if data.len() != 2 + digit_count as usize {
45            return Err(Error::MalformedPayload {
46                code: 0x53,
47                reason: "KEYPAD digit count disagrees with payload",
48            });
49        }
50        Ok(Self {
51            reader: data[0],
52            digit_count,
53            digits: data[2..].to_vec(),
54        })
55    }
56}