use std::io::{Cursor};
use crate::{
Result,
HeaderCoding,
ValueEncoder,
ValueDecoder,
};
use crate::version1::{
FOOTER_IDENTIFIER_SEGMENT_FOOTER,
};
pub struct SegmentFooter {
version: u8,
chunk_offsets: Vec<u64>
}
impl SegmentFooter {
pub fn new_empty(version: u8) -> SegmentFooter {
Self {
version,
chunk_offsets: Vec::new()
}
}
pub fn new(version: u8, chunk_offsets: Vec<u64>) -> SegmentFooter {
Self {
version,
chunk_offsets,
}
}
pub fn add_offset(&mut self, offset: u64) {
self.chunk_offsets.push(offset)
}
pub fn chunk_offsets(&self) -> &Vec<u64> {
&self.chunk_offsets
}
}
impl HeaderCoding for SegmentFooter {
type Item = SegmentFooter;
fn identifier() -> u32 {
FOOTER_IDENTIFIER_SEGMENT_FOOTER
}
fn version(&self) -> u8 {
self.version
}
fn encode_header(&self) -> Vec<u8> {
let mut vec = Vec::new();
vec.append(&mut self.version.encode_directly());
vec.append(&mut self.chunk_offsets.encode_directly());
vec
}
fn decode_content(data: Vec<u8>) -> Result<SegmentFooter> {
let mut cursor = Cursor::new(data);
let footer_version = u8::decode_directly(&mut cursor)?;
let chunk_offsets = Vec::<u64>::decode_directly(&mut cursor)?;
Ok(SegmentFooter::new(footer_version, chunk_offsets))
}
}