#![doc = include_str!("../readme.md")]
mod compression;
mod custom_compression;
mod error;
mod iter;
mod read;
pub mod write;
pub use compression::Compression;
pub use custom_compression::{CustomCompression, CustomDecompression};
pub use error::{CompressionError, McaError};
pub use iter::{AvailableChunk, ChunkIter, RegionIter};
pub use read::{ChunkDataRef, CompressedChunk, RegionReader};
pub use write::{RegionWriter, current_timestamp};
pub const REGION_SIZE: usize = 32;
pub(crate) const SECTOR_SIZE: usize = 4096;
#[inline(always)]
pub(crate) const fn header_offset(x: u8, z: u8) -> usize {
4 * ((x as usize & (REGION_SIZE - 1)) + (z as usize & (REGION_SIZE - 1)) * REGION_SIZE)
}
#[cfg(test)]
pub(crate) mod regions {
pub const FULL: &'static [u8] = include_bytes!("../data/full.mca");
pub const HALF: &'static [u8] = include_bytes!("../data/half.mca");
pub const LZ4: &'static [u8] = include_bytes!("../data/lz4.mca");
pub const NONE: &'static [u8] = include_bytes!("../data/raw.mca");
pub const EMPTY: &'static [u8] = include_bytes!("../data/empty.mca");
pub const CORRUPT: &'static [u8] = include_bytes!("../data/corrupt.mca");
pub const ZLIB: &'static [u8] = FULL;
}
#[cfg(test)]
mod test {
use crate::header_offset;
#[test]
fn offset() {
let coords = vec![
(0, 0, 0),
(1, 4, 516),
(5, 1, 148),
(13, 21, 2740),
(31, 8, 1148),
(31, 31, 4092),
];
for (x, z, should_be) in coords {
let idx = header_offset(x, z);
assert_eq!(idx, should_be, "({x}, {z})");
}
}
}