Skip to main content

oxigdal_compress/
lib.rs

1//! OxiGDAL Compression Library
2//!
3//! Advanced compression codecs and auto-selection for geospatial data.
4//!
5//! # Features
6//!
7//! - **Standard Codecs**: LZ4, Zstandard, Brotli, Snappy, DEFLATE
8//! - **Geospatial Codecs**: Delta encoding, RLE, Dictionary compression
9//! - **Floating-Point**: ZFP and SZ-style compression with error bounds
10//! - **Auto-Selection**: Intelligent codec selection based on data characteristics
11//! - **Parallel Processing**: Multi-threaded compression/decompression
12//! - **Benchmarking**: Built-in performance measurement
13//!
14//! # Examples
15//!
16//! ```rust
17//! use oxigdal_compress::{
18//!     codecs::{Lz4Codec, ZstdCodec},
19//!     auto_select::{AutoSelector, CompressionGoal, DataType, DataCharacteristics},
20//! };
21//!
22//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
23//! // Basic compression with LZ4
24//! let codec = Lz4Codec::new();
25//! let data = b"Hello, world!".repeat(1000);
26//! let compressed = codec.compress(&data)?;
27//! let decompressed = codec.decompress(&compressed, Some(data.len()))?;
28//! assert_eq!(decompressed, data);
29//!
30//! // Auto-selection
31//! let selector = AutoSelector::new(CompressionGoal::Balanced);
32//! let characteristics = DataCharacteristics {
33//!     data_type: DataType::Categorical,
34//!     size: 10000,
35//!     entropy: 0.3,
36//!     unique_count: Some(10),
37//!     value_range: None,
38//!     run_length_ratio: Some(50.0),
39//! };
40//! let recommendations = selector.recommend(&characteristics);
41//! println!("Recommended codec: {:?}", recommendations[0].codec);
42//! # Ok(())
43//! # }
44//! ```
45
46#![deny(missing_docs)]
47#![warn(clippy::unwrap_used, clippy::panic)]
48
49pub mod auto_select;
50pub mod benchmark;
51pub mod codecs;
52pub mod error;
53pub mod floating_point;
54pub mod metadata;
55pub mod parallel;
56
57pub use error::{CompressionError, Result};
58
59/// Prelude module for common imports
60pub mod prelude {
61    pub use crate::{
62        auto_select::{AutoSelector, CompressionGoal, DataCharacteristics, DataType},
63        codecs::{
64            BrotliCodec, CodecType, DeflateCodec, DeltaCodec, DictionaryCodec, Lz4Codec, RleCodec,
65            SnappyCodec, ZstdCodec,
66        },
67        error::{CompressionError, Result},
68        metadata::CompressionMetadata,
69        parallel::ParallelCompressor,
70    };
71}
72
73#[cfg(test)]
74mod tests {
75    use super::*;
76
77    #[test]
78    fn test_lz4_roundtrip() {
79        use codecs::Lz4Codec;
80
81        let codec = Lz4Codec::new();
82        let data = b"Test data".repeat(100);
83
84        let compressed = codec.compress(&data).expect("Compression failed");
85        let decompressed = codec
86            .decompress(&compressed, Some(data.len()))
87            .expect("Decompression failed");
88
89        assert_eq!(decompressed, data);
90    }
91
92    #[test]
93    fn test_zstd_roundtrip() {
94        use codecs::ZstdCodec;
95
96        let codec = ZstdCodec::new();
97        let data = b"Test data".repeat(100);
98
99        let compressed = codec.compress(&data).expect("Compression failed");
100        let decompressed = codec
101            .decompress(&compressed, Some(data.len() * 2))
102            .expect("Decompression failed");
103
104        assert_eq!(decompressed, data);
105    }
106}