feat: use an enum instead of raw ID for CPS type
This commit is contained in:
parent
cb4d352f12
commit
137e41430e
@ -17,10 +17,19 @@ where
|
|||||||
{
|
{
|
||||||
let text = String::from_utf8(data_field.data)
|
let text = String::from_utf8(data_field.data)
|
||||||
.map_err(|e| DekuError::Parse(e.to_string().into()))?;
|
.map_err(|e| DekuError::Parse(e.to_string().into()))?;
|
||||||
T::from_str(&text)
|
text.parse::<T>()
|
||||||
.map_err(|e| DekuError::Parse(e.to_string().into()))
|
.map_err(|e| DekuError::Parse(e.to_string().into()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// # Extract an enum id from a string
|
||||||
|
/// Deku enums only supports numbers as id, and we usually extract strings
|
||||||
|
/// from data fields. This function is used as a context function to convert
|
||||||
|
/// a string, such as obtained with NumericString, to an enum id
|
||||||
|
pub fn extract_enum_id_from_str<T>(id_string: &str, default: T) -> T
|
||||||
|
where T: FromStr {
|
||||||
|
id_string.parse::<T>().unwrap_or(default)
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------- DATA FIELD TYPES -------------------
|
// ------------------- DATA FIELD TYPES -------------------
|
||||||
|
|
||||||
/// # Data field structure
|
/// # Data field structure
|
||||||
@ -105,4 +114,13 @@ mod test {
|
|||||||
assert_eq!(software_version.version, "07");
|
assert_eq!(software_version.version, "07");
|
||||||
assert_eq!(software_version.revision, "20");
|
assert_eq!(software_version.revision, "20");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_map_from_data_field() {
|
||||||
|
let data_field = DataField {
|
||||||
|
data: vec![48, 55],
|
||||||
|
};
|
||||||
|
let id: u8 = map_from_data_field(data_field).unwrap();
|
||||||
|
assert_eq!(id, 7);
|
||||||
|
}
|
||||||
}
|
}
|
@ -8,7 +8,7 @@ use crate::fsv_parsing::groups::NumericString;
|
|||||||
/// 1 occurence
|
/// 1 occurence
|
||||||
pub mod group_1_holder {
|
pub mod group_1_holder {
|
||||||
|
|
||||||
use crate::fsv_parsing::groups::AlphaNumericString;
|
use crate::fsv_parsing::groups::{ extract_enum_id_from_str, AlphaNumericString };
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
@ -16,6 +16,9 @@ pub mod group_1_holder {
|
|||||||
#[deku_derive(DekuRead)]
|
#[deku_derive(DekuRead)]
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct Holder {
|
pub struct Holder {
|
||||||
|
#[deku(temp)]
|
||||||
|
card_type_raw: NumericString,
|
||||||
|
#[deku(ctx = "extract_enum_id_from_str::<u8>(&*card_type_raw.0, 255)")]
|
||||||
pub card_type: CardPSType,
|
pub card_type: CardPSType,
|
||||||
pub national_id_type: NationalIDType,
|
pub national_id_type: NationalIDType,
|
||||||
pub national_id: AlphaNumericString, // /!\ CE and not CA
|
pub national_id: AlphaNumericString, // /!\ CE and not CA
|
||||||
@ -29,7 +32,19 @@ pub mod group_1_holder {
|
|||||||
// Fields
|
// Fields
|
||||||
#[deku_derive(DekuRead)]
|
#[deku_derive(DekuRead)]
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct CardPSType(pub NumericString);
|
#[deku(ctx = "id: u8", id = "id")]
|
||||||
|
pub enum CardPSType {
|
||||||
|
#[deku(id = 0)]
|
||||||
|
CPS, // Carte de Professionnel de Santé (CPS)
|
||||||
|
#[deku(id = 1)]
|
||||||
|
CPF, // Carte de Professionnel de Santé en Formation (CPF)
|
||||||
|
#[deku(id = 2)]
|
||||||
|
CPE, // Carte de Personnel / Directeur⋅ice d'Établissement de Santé (CDE/CPE)
|
||||||
|
#[deku(id = 3)]
|
||||||
|
CPA, // Carte de Personnel / Directeur⋅ice Autorisé⋅e (CDA/CPA)
|
||||||
|
#[deku(id = 4)]
|
||||||
|
CPM, // Carte de Personne Morale
|
||||||
|
}
|
||||||
|
|
||||||
#[deku_derive(DekuRead)]
|
#[deku_derive(DekuRead)]
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
@ -45,6 +60,7 @@ pub mod group_1_holder {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use deku::DekuContainerRead as _;
|
use deku::DekuContainerRead as _;
|
||||||
|
use group_1_holder::CardPSType;
|
||||||
|
|
||||||
use crate::fsv_parsing::blocks::BlockHeader;
|
use crate::fsv_parsing::blocks::BlockHeader;
|
||||||
|
|
||||||
@ -133,7 +149,7 @@ mod tests {
|
|||||||
env_logger::init(); // Uncomment and run with RUST_LOG=trace for deku debugging
|
env_logger::init(); // Uncomment and run with RUST_LOG=trace for deku debugging
|
||||||
let offset = 3*8;
|
let offset = 3*8;
|
||||||
let (_rest, holder) = group_1_holder::Holder::from_bytes((data::BUFFER, offset)).unwrap();
|
let (_rest, holder) = group_1_holder::Holder::from_bytes((data::BUFFER, offset)).unwrap();
|
||||||
assert_eq!(holder.card_type.0.0, "0", "Card type");
|
assert_eq!(holder.card_type, CardPSType::CPS, "Card type");
|
||||||
assert_eq!(holder.national_id_type.0.0, "8", "National ID type");
|
assert_eq!(holder.national_id_type.0.0, "8", "National ID type");
|
||||||
assert_eq!(holder.national_id.0, "99700593686", "National Id");
|
assert_eq!(holder.national_id.0, "99700593686", "National Id");
|
||||||
assert_eq!(holder.national_id_key.0, "6", "National ID Key");
|
assert_eq!(holder.national_id_key.0, "6", "National ID Key");
|
||||||
|
Loading…
Reference in New Issue
Block a user