use crate::{Identifier, Result};
use byteorder::{ByteOrder, ReadBytesExt, WriteBytesExt};
use std::{
fmt::Debug,
io::{Read, Write},
};
#[repr(C, align(16))]
#[derive(Copy, Clone, PartialEq, Hash)]
pub struct Chunk {
identifier: Identifier,
length: u64,
offset: u64,
}
impl Debug for Chunk {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"({:X}) - {}, {}",
*self.identifier, self.length, self.offset
)
}
}
impl Chunk {
pub const SIZE: usize = std::mem::size_of::<Self>();
pub fn new(identifier: impl Into<Identifier>, length: u64, offset: u64) -> Self {
Self {
identifier: identifier.into(),
length,
offset,
}
}
pub fn identifier(&self) -> Identifier {
self.identifier
}
pub fn length(&self) -> u64 {
self.length
}
pub fn length_mut(&mut self) -> &mut u64 {
&mut self.length
}
pub fn offset(&self) -> u64 {
self.offset
}
pub fn offset_mut(&mut self) -> &mut u64 {
&mut self.offset
}
pub fn read<E: ByteOrder>(reader: &mut dyn Read) -> Result<Self> {
Ok(Self {
identifier: reader.read_u128::<E>()?.try_into()?,
length: reader.read_u64::<E>()?,
offset: reader.read_u64::<E>()?,
})
}
pub fn write<E: ByteOrder>(self, writer: &mut dyn Write) -> Result<()> {
writer.write_u128::<E>(*self.identifier)?;
writer.write_u64::<E>(self.length)?;
writer.write_u64::<E>(self.offset)?;
Ok(())
}
}