Expand description
Pure-Rust port of the Zstandard (zstd) compression library.
See README.md for status and the overall plan.
§Quickstart
use zstd_pure_rs::prelude::*;
let src = b"Pure-Rust zstd can compress this.".to_vec();
// Compress at level 3 (upstream default).
let mut compressed = vec![0u8; ZSTD_compressBound(src.len())];
let cSize = ZSTD_compress(&mut compressed, &src, 3);
assert!(!ERR_isError(cSize));
compressed.truncate(cSize);
// Decompress.
let mut decoded = vec![0u8; src.len()];
let dSize = ZSTD_decompress(&mut decoded, &compressed);
assert_eq!(dSize, src.len());
assert_eq!(decoded, src);§Skippable frames
use zstd_pure_rs::prelude::*;
// Skippable frames embed arbitrary user data that decoders skip.
let payload = b"custom-metadata-goes-here";
let mut frame = vec![0u8; payload.len() + 8];
let wn = ZSTD_writeSkippableFrame(&mut frame, payload, 7);
assert_eq!(wn, payload.len() + 8);
// Read back the payload + magic variant.
let mut out = vec![0u8; payload.len()];
let mut variant = 0u32;
let rn = ZSTD_readSkippableFrame(&mut out, Some(&mut variant), &frame);
assert_eq!(rn, payload.len());
assert_eq!(variant, 7);
assert_eq!(&out, payload);§Dictionary-based compression
use zstd_pure_rs::prelude::*;
let dict = b"common prefix shared across messages ".to_vec();
let src = b"common prefix shared across messages \
plus per-message content".to_vec();
// One-shot dict compression via raw content.
let mut cctx = ZSTD_createCCtx().expect("alloc");
let mut dst = vec![0u8; ZSTD_compressBound(src.len())];
let n = ZSTD_compress_usingDict(&mut cctx, &mut dst, &src, &dict, 3);
assert!(!ERR_isError(n));
dst.truncate(n);
// Decompress with the same dict.
let mut dctx = ZSTD_createDCtx();
let mut out = vec![0u8; src.len() + 64];
let d = ZSTD_decompress_usingDict(&mut dctx, &mut out, &dst, &dict);
assert_eq!(&out[..d], &src[..]);§Streaming compression
use zstd_pure_rs::prelude::*;
let src = b"streaming compression demo ".repeat(30);
let mut cctx = ZSTD_createCCtx().expect("alloc");
ZSTD_initCStream(&mut cctx, 3);
// Stage input, then drive endStream until fully drained.
let mut dst = vec![0u8; ZSTD_compressBound(src.len())];
let mut dst_pos = 0usize;
let mut src_pos = 0usize;
ZSTD_compressStream(&mut cctx, &mut dst, &mut dst_pos, &src, &mut src_pos);
loop {
let rc = ZSTD_endStream(&mut cctx, &mut dst, &mut dst_pos);
if rc == 0 || ERR_isError(rc) { break; }
}
// Decompress via the public one-shot entry.
let mut out = vec![0u8; src.len() + 64];
let d = ZSTD_decompress(&mut out, &dst[..dst_pos]);
assert_eq!(&out[..d], &src[..]);§Parametric API (advanced)
use zstd_pure_rs::prelude::*;
let src = b"parametric api demo".repeat(20);
let mut cctx = ZSTD_createCCtx().expect("alloc");
// Opt into XXH64 checksum + exact frame-header FCS.
ZSTD_CCtx_setParameter(&mut cctx, ZSTD_cParameter::ZSTD_c_compressionLevel, 5);
ZSTD_CCtx_setParameter(&mut cctx, ZSTD_cParameter::ZSTD_c_checksumFlag, 1);
ZSTD_CCtx_setParameter(&mut cctx, ZSTD_cParameter::ZSTD_c_contentSizeFlag, 1);
let mut dst = vec![0u8; ZSTD_compressBound(src.len())];
let n = ZSTD_compress2(&mut cctx, &mut dst, &src);
assert!(!ERR_isError(n));
dst.truncate(n);
let mut out = vec![0u8; src.len() + 64];
let d = ZSTD_decompress(&mut out, &dst);
assert_eq!(&out[..d], &src[..]);See upstream’s zstd.h for API semantics. The main public ZSTD_
entry points are available under the zstd_pure_rs::prelude
re-exports. Lower-level HUF_ and FSE_ helpers remain in their
module namespaces unless explicitly re-exported there; unsupported
experimental parameters return the corresponding error codes.
Re-exports§
pub use common::error::ErrorCode;pub use common::error::ZstdError;pub use common::mem::is_little_endian;pub use common::zstd_common::ZSTD_getErrorCode;pub use common::zstd_common::ZSTD_getErrorName;pub use common::zstd_common::ZSTD_getErrorString;pub use common::zstd_common::ZSTD_isDeterministicBuild;pub use common::zstd_common::ZSTD_isError;pub use common::zstd_common::ZSTD_versionNumber;pub use common::zstd_common::ZSTD_versionString;pub use common::zstd_common::ZSTD_VERSION_MAJOR;pub use common::zstd_common::ZSTD_VERSION_MINOR;pub use common::zstd_common::ZSTD_VERSION_NUMBER;pub use common::zstd_common::ZSTD_VERSION_RELEASE;pub use common::zstd_common::ZSTD_VERSION_STRING;
Modules§
- common
lib/common/translation: shared primitives (bits, mem, errors, entropy).- compress
lib/compress/translation.- decompress
lib/decompress/translation.- dict_
builder - Dictionary trainer — mirror of
zstd/lib/dictBuilder/. - prelude
- Re-exports of the most commonly-used public API, so callers can
write
use zstd_pure_rs::prelude::*;instead of drilling intocompress::zstd_compress/decompress::zstd_decompress.
Constants§
- ZSTD_
BLOCKSPLITTER_ LEVEL_ MAX - Upstream
ZSTD_BLOCKSPLITTER_LEVEL_MAX. - ZSTD_
SEQUENCE_ PRODUCER_ ERROR - Upstream
ZSTD_SEQUENCE_PRODUCER_ERROR. - ZSTD_
c_ block Delimiters - ZSTD_
c_ block Splitter Level - ZSTD_
c_ deterministic RefPrefix - ZSTD_
c_ enable Dedicated Dict Search - ZSTD_
c_ enable SeqProducer Fallback - ZSTD_
c_ force Attach Dict - ZSTD_
c_ force MaxWindow - ZSTD_
c_ format - Upstream macro aliases for implemented experimental parameter names.
- ZSTD_
c_ literal Compression Mode - ZSTD_
c_ maxBlock Size - ZSTD_
c_ prefetchC Dict Tables - ZSTD_
c_ repcode Resolution - ZSTD_
c_ rsyncable - ZSTD_
c_ search ForExternal Repcodes - ZSTD_
c_ split After Sequences - ZSTD_
c_ srcSize Hint - ZSTD_
c_ stable InBuffer - ZSTD_
c_ stable OutBuffer - ZSTD_
c_ useRow Match Finder - ZSTD_
c_ validate Sequences - ZSTD_
d_ force Ignore Checksum - ZSTD_
d_ format
Type Aliases§
- ZSTD_
frame Header - Upstream-compatible legacy alias for
ZSTD_FrameHeader. - ZSTD_
frame Parameters - Upstream-compatible alias for
ZSTD_frameParameters. - ZSTD_
frame Type_ e - Upstream-compatible legacy alias for
ZSTD_FrameType_e. - ZSTD_
param Switch_ e - Upstream-compatible legacy alias for
ZSTD_ParamSwitch_e. - ZSTD_
sequence Format_ e - Upstream-compatible legacy alias for
ZSTD_SequenceFormat_e. - ZSTD_
thread Pool - Upstream-compatible alias for
ZSTD_threadPool.