feat: implement parsing to data structures
This commit is contained in:
parent
c0bbdcf030
commit
6d9cd7fc14
@ -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<T, E: Error> MapToDekuParseError<T> for Result<T, E> {
|
||||
|
||||
#[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<DekuDataField>,
|
||||
#[deku(ctx = "header.group_id")]
|
||||
pub inner: DataGroup,
|
||||
}
|
||||
|
||||
fn read_size<R: std::io::Read>(reader: &mut Reader<R>) -> Result<ByteSize, DekuError> {
|
||||
@ -77,3 +77,81 @@ fn read_size<R: std::io::Read>(reader: &mut Reader<R>) -> Result<ByteSize, DekuE
|
||||
false => 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<T>(data_field: DataField) -> Result<T, DekuError>
|
||||
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),
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user