1use crate::error::Error;
11use alloc::vec::Vec;
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq)]
15#[repr(u8)]
16#[allow(missing_docs)]
17pub enum XwrMode00 {
18 ReadMode = 0x01,
19 SetMode = 0x02,
20}
21
22#[derive(Debug, Clone, Copy, PartialEq, Eq)]
24#[repr(u8)]
25#[allow(missing_docs)]
26pub enum XwrMode01 {
27 TransmitApdu = 0x01,
28 ConnectionDone = 0x02,
29 SecurePinEntry = 0x03,
30 SmartCardScan = 0x04,
31}
32
33#[derive(Debug, Clone, PartialEq, Eq)]
37pub struct XWrite {
38 pub mode: u8,
40 pub payload: Vec<u8>,
42}
43
44impl XWrite {
45 pub fn encode(&self) -> Result<Vec<u8>, Error> {
47 let mut out = Vec::with_capacity(1 + self.payload.len());
48 out.push(self.mode);
49 out.extend_from_slice(&self.payload);
50 Ok(out)
51 }
52
53 pub fn decode(data: &[u8]) -> Result<Self, Error> {
55 if data.is_empty() {
56 return Err(Error::MalformedPayload {
57 code: 0xA1,
58 reason: "XWR requires XRW_MODE byte",
59 });
60 }
61 Ok(Self {
62 mode: data[0],
63 payload: data[1..].to_vec(),
64 })
65 }
66}