From fbc3be564f3bc6a2617048ea9105ed126c9f134b Mon Sep 17 00:00:00 2001 From: theo Date: Wed, 28 Aug 2024 23:34:09 +0200 Subject: [PATCH] feat: implement parsing to data structures --- .../src/types/serialization_types.rs | 88 +++++++++++++++++-- 1 file changed, 83 insertions(+), 5 deletions(-) diff --git a/crates/services-sesam-vitale-sys/src/types/serialization_types.rs b/crates/services-sesam-vitale-sys/src/types/serialization_types.rs index 65c560d..e28812d 100644 --- a/crates/services-sesam-vitale-sys/src/types/serialization_types.rs +++ b/crates/services-sesam-vitale-sys/src/types/serialization_types.rs @@ -1,5 +1,5 @@ use bitvec::index::BitIdx; -use std::{error::Error, vec::Vec}; +use std::{error::Error, str::FromStr, vec::Vec}; use deku::{ bitvec::{BitStore, Msb0}, @@ -10,7 +10,7 @@ use deku::{ }; #[deku_derive(DekuRead)] -#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)] +#[derive(Debug, Clone, Copy, PartialEq)] #[deku(endian = "big")] pub struct GroupId(u16); @@ -26,7 +26,7 @@ impl MapToDekuParseError for Result { #[deku_derive(DekuRead)] #[derive(Debug, PartialEq)] -pub struct DekuDataField { +pub struct DataField { #[deku(reader = "read_size(deku::reader)")] data_size: ByteSize, @@ -48,8 +48,8 @@ pub struct BlockHeader { pub struct DataBlock { pub header: BlockHeader, - #[deku(bytes_read = "header.data_size.0")] - pub data: Vec, + #[deku(ctx = "header.group_id")] + pub inner: DataGroup, } fn read_size(reader: &mut Reader) -> Result { @@ -77,3 +77,81 @@ fn read_size(reader: &mut Reader) -> Result Ok(ByteSize(first_byte as usize)), } } + +// Using this as the map function asks deku to parse a datafield +// We then use the datafield and convert it to the corresponding value +fn convert_from_data_field(data_field: DataField) -> Result +where + T: FromStr, + T::Err: Error, +{ + let text = String::from_utf8(data_field.data).map_to_deku_parse_error()?; + T::from_str(&text).map_to_deku_parse_error() +} + +#[deku_derive(DekuRead)] +#[derive(Debug, PartialEq)] +pub struct SSVVersionNumber(#[deku(map = "convert_from_data_field")] u16); + +#[deku_derive(DekuRead)] +#[derive(Debug, PartialEq)] +pub struct GALSSVersionNumber(#[deku(map = "convert_from_data_field")] u16); + +#[deku_derive(DekuRead)] +#[derive(Debug, PartialEq)] +pub struct PSSVersionNumber(#[deku(map = "convert_from_data_field")] u16); + +#[deku_derive(DekuRead)] +#[derive(Debug, PartialEq)] +pub struct ConfigurationHeader { + pub ssv_version: SSVVersionNumber, + pub galss_version: GALSSVersionNumber, + pub pss_version: PSSVersionNumber, +} + +#[deku_derive(DekuRead)] +#[derive(Debug, PartialEq)] +pub struct PCSCReaderName(#[deku(map = "convert_from_data_field")] String); + +#[deku_derive(DekuRead)] +#[derive(Debug, PartialEq)] +pub struct CardType(#[deku(map = "convert_from_data_field")] u8); + +#[deku_derive(DekuRead)] +#[derive(Debug, PartialEq)] +pub struct PCSCReader { + pub name: PCSCReaderName, + pub card_type: CardType, +} + +#[deku_derive(DekuRead)] +#[derive(Debug, PartialEq)] +pub struct SESAMVitaleComponentID(#[deku(map = "convert_from_data_field")] u16); + +#[deku_derive(DekuRead)] +#[derive(Debug, PartialEq)] +pub struct SESAMVitaleComponentDescription(#[deku(map = "convert_from_data_field")] String); + +#[deku_derive(DekuRead)] +#[derive(Debug, PartialEq)] +pub struct SESAMVitaleComponentVersion(#[deku(map = "convert_from_data_field")] String); + +#[deku_derive(DekuRead)] +#[derive(Debug, PartialEq)] +pub struct SESAMVitaleComponent { + pub id: SESAMVitaleComponentID, + pub description: SESAMVitaleComponentDescription, + pub version: SESAMVitaleComponentVersion, +} + +#[deku_derive(DekuRead)] +#[derive(Debug, PartialEq)] +#[deku(ctx = "group_id: GroupId", id = "group_id.0")] +pub enum DataGroup { + #[deku(id = 60)] + ConfigurationHeader(ConfigurationHeader), + #[deku(id = 67)] + PCSCReader(PCSCReader), + #[deku(id = 64)] + SESAMVitaleComponent(SESAMVitaleComponent), +}