#![warn(missing_docs)]
#![warn(clippy::all)]
mod encode;
mod frame;
mod fse;
mod huffman;
mod literals;
mod sequences;
mod xxhash;
pub use encode::{CompressionStrategy, ZstdEncoder, compress, compress_no_checksum};
pub use frame::{ZstdDecoder, decompress};
#[cfg(feature = "parallel")]
pub use encode::compress_parallel;
use oxiarc_core::error::{OxiArcError, Result};
pub const ZSTD_MAGIC: [u8; 4] = [0x28, 0xB5, 0x2F, 0xFD];
pub const SKIPPABLE_MAGIC_LOW: u32 = 0x184D2A50;
pub const SKIPPABLE_MAGIC_HIGH: u32 = 0x184D2A5F;
pub const MAX_WINDOW_SIZE: usize = 8 * 1024 * 1024;
pub const MAX_BLOCK_SIZE: usize = 128 * 1024;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BlockType {
Raw,
Rle,
Compressed,
Reserved,
}
impl BlockType {
pub fn from_bits(bits: u8) -> Result<Self> {
match bits & 0x03 {
0 => Ok(BlockType::Raw),
1 => Ok(BlockType::Rle),
2 => Ok(BlockType::Compressed),
3 => Err(OxiArcError::CorruptedData {
offset: 0,
message: "reserved block type".to_string(),
}),
_ => unreachable!(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LiteralsBlockType {
Raw,
Rle,
Compressed,
Treeless,
}
impl LiteralsBlockType {
pub fn from_bits(bits: u8) -> Self {
match bits & 0x03 {
0 => LiteralsBlockType::Raw,
1 => LiteralsBlockType::Rle,
2 => LiteralsBlockType::Compressed,
3 => LiteralsBlockType::Treeless,
_ => unreachable!(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_block_type_from_bits() {
assert_eq!(BlockType::from_bits(0).unwrap(), BlockType::Raw);
assert_eq!(BlockType::from_bits(1).unwrap(), BlockType::Rle);
assert_eq!(BlockType::from_bits(2).unwrap(), BlockType::Compressed);
assert!(BlockType::from_bits(3).is_err());
}
#[test]
fn test_literals_block_type() {
assert_eq!(LiteralsBlockType::from_bits(0), LiteralsBlockType::Raw);
assert_eq!(LiteralsBlockType::from_bits(1), LiteralsBlockType::Rle);
assert_eq!(
LiteralsBlockType::from_bits(2),
LiteralsBlockType::Compressed
);
assert_eq!(LiteralsBlockType::from_bits(3), LiteralsBlockType::Treeless);
}
#[test]
fn test_zstd_magic() {
assert_eq!(u32::from_le_bytes(ZSTD_MAGIC), 0xFD2FB528);
}
}