Skip to main content

compression/
lib.rs

1#![cfg_attr(docsrs, feature(doc_cfg))]
2#![allow(
3    clippy::doc_markdown,
4    clippy::missing_const_for_fn,
5    clippy::missing_errors_doc,
6    clippy::module_name_repetitions,
7    clippy::must_use_candidate,
8    clippy::use_self
9)]
10#![doc = include_str!("../README.md")]
11
12#[cfg(not(target_os = "macos"))]
13compile_error!("compression only supports macOS");
14
15mod aa_archive_stream;
16mod aa_byte_stream;
17mod aa_entry_blob;
18mod aa_entry_stream;
19mod aa_field_key;
20mod aa_header;
21mod aea;
22mod compression_decode;
23mod compression_encode;
24mod compression_stream;
25mod error;
26mod ffi;
27/// Wraps the raw `compression.h` and AppleArchive FFI surface.
28#[cfg(feature = "raw-ffi")]
29pub mod raw_ffi;
30pub(crate) mod util;
31
32pub use aa_archive_stream::{
33    ArchiveStream, CustomArchiveStreamCallbacks, EntryMessageData, EntryMessageEvent,
34    EntryMessageHandler,
35};
36pub use aa_byte_stream::{
37    ArchiveCompressionAlgorithm, ArchiveFlags, ByteStream, CustomByteStreamCallbacks,
38    DEFAULT_FILE_MODE, OPEN_CREATE, OPEN_READ_ONLY, OPEN_READ_WRITE, OPEN_TRUNCATE,
39    OPEN_WRITE_ONLY,
40};
41pub use aa_entry_blob::{
42    AccessControlEntry, AceFlagSet, AcePermSet, AceQualifierType, AceTag, EntryAclBlob,
43    EntryXatBlob, NamedBlobEntry,
44};
45pub use aa_entry_stream::{EntryAttributes, EntryMessage, PathList};
46pub use aa_field_key::{FieldKey, FieldKeySet};
47pub use aa_header::{
48    BlobDescription, EntryType, FieldType, HashFunction, HashValue, Header, HeaderFieldValue,
49    Timespec,
50};
51pub use aea::{
52    AeaAuthData, AeaChecksumMode, AeaCiphersuite, AeaContext, AeaContextField,
53    AeaContextFieldRepresentation, AeaEncryptionMode, AeaPadding, AeaProfile, AeaSignatureMode,
54};
55pub use compression_decode::{
56    compression_decode_buffer, compression_decode_scratch_buffer_size, decompress,
57};
58pub use compression_encode::{
59    compress, compression_encode_buffer, compression_encode_scratch_buffer_size,
60};
61pub use compression_stream::{CompressionStream, Decoder, Encoder, StreamOperation};
62pub use error::{CompressionError, Result};
63
64/// Wraps `compression_algorithm` values from `compression.h`.
65#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
66pub enum Algorithm {
67    /// Wraps `COMPRESSION_LZ4`.
68    Lz4,
69    /// Wraps `COMPRESSION_ZLIB`.
70    Zlib,
71    /// Wraps `COMPRESSION_LZMA`.
72    Lzma,
73    /// Wraps `COMPRESSION_LZ4_RAW`.
74    Lz4Raw,
75    /// Wraps `COMPRESSION_BROTLI`.
76    Brotli,
77    /// Wraps `COMPRESSION_LZFSE`.
78    Lzfse,
79    /// Wraps `COMPRESSION_LZBITMAP`.
80    Lzbitmap,
81}
82
83impl Algorithm {
84    /// Wraps the streaming-capable `compression_algorithm` set.
85    pub const ALL: [Self; 5] = [Self::Lz4, Self::Zlib, Self::Lzma, Self::Brotli, Self::Lzfse];
86    /// Wraps the buffer-capable `compression_algorithm` set.
87    pub const BUFFER_ALL: [Self; 7] = [
88        Self::Lz4,
89        Self::Zlib,
90        Self::Lzma,
91        Self::Lz4Raw,
92        Self::Brotli,
93        Self::Lzfse,
94        Self::Lzbitmap,
95    ];
96
97    /// Wraps stream support for `compression_stream_*` entry points.
98    pub const fn supports_streams(self) -> bool {
99        !matches!(self, Self::Lz4Raw | Self::Lzbitmap)
100    }
101
102    pub(crate) const fn as_raw(self) -> u32 {
103        match self {
104            Self::Lz4 => 0x100,
105            Self::Zlib => 0x205,
106            Self::Lzma => 0x306,
107            Self::Lz4Raw => 0x101,
108            Self::Brotli => 0xB02,
109            Self::Lzfse => 0x801,
110            Self::Lzbitmap => 0x702,
111        }
112    }
113}