use deku::prelude::*;
use crate::base38;
use crate::error::{PayloadError, Result};
use super::common::CommissioningFlow;
#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
#[deku(endian = "big")]
pub(super) struct QrCodeData {
#[deku(bits = "4")]
pub padding: u8,
#[deku(bits = "27")]
pub pincode: u32,
#[deku(bits = "12")]
pub discriminator: u16,
#[deku(bits = "8")]
pub discovery: u8,
pub flow: CommissioningFlow,
#[deku(bits = "16")]
pub pid: u16,
#[deku(bits = "16")]
pub vid: u16,
#[deku(bits = "3")]
pub version: u8,
}
impl QrCodeData {
pub(super) fn parse_from_str(payload: &str) -> Result<Self> {
if !payload.starts_with("MT:") {
return Err(PayloadError::InvalidQrCodePrefix.into());
}
let encoded = &payload[3..];
let mut decoded_bytes = base38::decode(encoded)?;
decoded_bytes.reverse();
let (_rest, data) = QrCodeData::from_bytes((&decoded_bytes, 0))?;
Ok(data)
}
}