use std::ops::Range;
use rkyv::{Archive, Deserialize, Serialize};
use crate::address::BlockId;
#[derive(Debug, Clone, PartialEq, Archive, Serialize, Deserialize)]
pub enum CodecId {
None,
Named(String),
}
#[derive(Debug, Clone, PartialEq, Archive, Serialize, Deserialize)]
pub struct BlockMeta {
pub id: BlockId,
pub file_offset: u64,
pub compressed_size: u64,
pub uncompressed_size: u64,
pub codec: CodecId,
}
impl BlockMeta {
pub fn file_range(&self) -> Range<u64> {
self.file_offset..self.file_offset + self.compressed_size
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn file_range_computation() {
let meta = BlockMeta {
id: BlockId(0),
file_offset: 100,
compressed_size: 50,
uncompressed_size: 200,
codec: CodecId::None,
};
assert_eq!(meta.file_range(), 100..150);
}
#[test]
fn named_codec_id() {
let codec = CodecId::Named("zstd".into());
assert_eq!(codec, CodecId::Named("zstd".into()));
assert_ne!(codec, CodecId::None);
}
}