use std::marker::PhantomData;
use binrw::binrw;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::hash::HashCode16;
#[binrw]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BinaryDataContentHeaderSerializer<T>
where
T: HeaderSerializer,
{
#[br(temp)]
#[bw(calc = attributes.len() as u16)]
attribute_num: u16,
#[br(temp)]
#[bw(calc = T::data_size() as u16)]
_data_size: u16,
#[br(count = attribute_num as usize)]
pub attributes: Vec<BinaryDataContentAttribute>,
#[cfg_attr(feature = "serde", serde(skip))]
phantom: PhantomData<T>,
}
impl<T> From<Vec<BinaryDataContentAttribute>> for BinaryDataContentHeaderSerializer<T>
where
T: HeaderSerializer,
{
fn from(attributes: Vec<BinaryDataContentAttribute>) -> Self {
Self {
attributes,
phantom: PhantomData::<T>,
}
}
}
#[binrw]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct BinaryDataContentAttribute {
pub key: HashCode16,
pub offset: u16,
}
pub trait HeaderSerializer: Sized {
fn header_serializer() -> BinaryDataContentHeaderSerializer<Self>;
fn header_size() -> usize;
fn data_size() -> usize;
}