use std::io::Error;
use std::io::Read;
use std::io::Write;
use codeq::FixedSize;
use crate::v001::types::Segment;
#[derive(Debug)]
#[derive(Clone)]
#[derive(PartialEq, Eq)]
pub struct Footer {
pub(crate) block_index_segment: Segment,
pub(crate) meta_segment: Segment,
pub(crate) stat_segment: Segment,
}
impl Footer {
pub fn new(block_index: Segment, meta: Segment, stat: Segment) -> Self {
Self {
block_index_segment: block_index,
meta_segment: meta,
stat_segment: stat,
}
}
}
impl FixedSize for Footer {
fn encoded_size() -> usize {
Segment::encoded_size() * 3
}
}
impl codeq::Encode for Footer {
fn encode<W: Write>(&self, mut w: W) -> Result<usize, Error> {
let mut n = 0;
n += self.block_index_segment.encode(&mut w)?;
n += self.meta_segment.encode(&mut w)?;
n += self.stat_segment.encode(&mut w)?;
Ok(n)
}
}
impl codeq::Decode for Footer {
fn decode<R: Read>(mut r: R) -> Result<Self, Error> {
let block_index = Segment::decode(&mut r)?;
let meta = Segment::decode(&mut r)?;
let stat = Segment::decode(&mut r)?;
Ok(Self {
block_index_segment: block_index,
meta_segment: meta,
stat_segment: stat,
})
}
}
#[cfg(test)]
mod tests {
use codeq::testing::test_codec;
use crate::v001::footer::Footer;
use crate::v001::types::Segment;
#[test]
fn test_footer_codec() -> anyhow::Result<()> {
let f = Footer::new(
Segment::new(5, 10),
Segment::new(3, 4),
Segment::new(15, 20),
);
let b = vec![
0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 70, 249, 231, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 210, 91, 179, 137, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 41, 216, 80, 249, ];
test_codec(b.as_slice(), &f)?;
Ok(())
}
}