pub mod types;
use core::fmt::Display;
pub use self::types::*;
use crate::utils::ToBytes;
use alloc::string::String;
use alloc::string::ToString;
use alloc::vec;
use alloc::vec::Vec;
use serde::{Deserialize, Serialize};
pub const CODE_MIN_VALUE: i16 = 1;
pub const CODE_MAX_VALUE: i16 = u8::MAX as i16;
#[derive(Debug, Clone)]
pub struct FieldHeader {
pub type_code: i16,
pub field_code: i16,
}
#[derive(Debug, Clone)]
pub struct FieldInstance {
pub nth: i16,
pub is_vl_encoded: bool,
pub is_serialized: bool,
pub is_signing: bool,
pub associated_type: String,
pub name: String,
pub header: FieldHeader,
pub ordinal: i32,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct FieldInfo {
pub nth: i16,
#[serde(rename = "isVLEncoded")]
pub is_vl_encoded: bool,
pub is_serialized: bool,
pub is_signing_field: bool,
pub r#type: String,
}
impl FieldInstance {
pub fn new(field_info: &FieldInfo, field_name: &str, field_header: FieldHeader) -> Self {
FieldInstance {
nth: field_info.nth,
is_vl_encoded: field_info.is_vl_encoded,
is_serialized: field_info.is_serialized,
is_signing: field_info.is_signing_field,
name: field_name.to_string(),
ordinal: &(field_header.type_code as i32) << 16 | field_info.nth as i32,
header: field_header,
associated_type: field_info.r#type.to_string(),
}
}
}
impl Display for FieldHeader {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
write!(f, "{}_{}", self.type_code, self.field_code)
}
}
impl ToBytes for FieldHeader {
fn to_bytes(&self) -> Vec<u8> {
let mut header_bytes = vec![];
if self.type_code < 16 {
if self.field_code < 16 {
let shift = (self.type_code << 4 | self.field_code) as u8;
header_bytes.extend_from_slice(&shift.to_be_bytes());
} else {
let shift = (self.type_code << 4) as u8;
header_bytes.extend_from_slice(&shift.to_be_bytes());
header_bytes.extend_from_slice(&(self.field_code as u8).to_be_bytes());
}
} else if self.field_code < 16 {
header_bytes.extend_from_slice(&(self.field_code as u8).to_be_bytes());
header_bytes.extend_from_slice(&(self.type_code as u8).to_be_bytes());
} else {
header_bytes.extend_from_slice(&[0]);
header_bytes.extend_from_slice(&(self.type_code as u8).to_be_bytes());
header_bytes.extend_from_slice(&(self.field_code as u8).to_be_bytes());
}
header_bytes
}
}