use serde::Serialize;
use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout, Unaligned};
use crate::{
signatures::Signature,
tag::{
tagdata::{DataSignature, SignatureData},
TagDataTraits,
},
};
#[derive(Serialize)]
pub struct SignatureType {
signature: String,
}
#[repr(C)]
#[derive(FromBytes, IntoBytes, KnownLayout, Unaligned, Immutable)]
pub struct Layout {
signature: [u8; 4],
_reserved: [u8; 4],
data: [u8; 4],
}
impl Default for Layout {
fn default() -> Self {
Self {
signature: DataSignature::SignatureData.into(),
_reserved: [0; 4],
data: [0; 4],
}
}
}
impl Layout {
pub fn new(signature: &str) -> Self {
let s: Signature = signature
.parse()
.expect("Signature must be a valid 4-character string");
let data: [u8; 4] = s.into();
Self {
signature: DataSignature::SignatureData.into(),
_reserved: [0; 4],
data,
}
}
}
impl From<&SignatureData> for SignatureType {
fn from(signature_data: &SignatureData) -> Self {
let layout = Layout::ref_from_bytes(signature_data.as_slice()).unwrap();
Self {
signature: format!("{}", String::from_utf8_lossy(&layout.data)),
}
}
}
impl SignatureData {
pub fn set_signature(&mut self, signature: &str) {
let data = Layout::new(signature);
self.0 = data.as_bytes().to_vec();
}
}