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#[cfg(feature = "raw-ffi")]
28pub mod raw_ffi;
29pub(crate) mod util;
30
31pub use aa_archive_stream::{
32 ArchiveStream, CustomArchiveStreamCallbacks, EntryMessageData, EntryMessageEvent,
33 EntryMessageHandler,
34};
35pub use aa_byte_stream::{
36 ArchiveCompressionAlgorithm, ArchiveFlags, ByteStream, CustomByteStreamCallbacks,
37 DEFAULT_FILE_MODE, OPEN_CREATE, OPEN_READ_ONLY, OPEN_READ_WRITE, OPEN_TRUNCATE,
38 OPEN_WRITE_ONLY,
39};
40pub use aa_entry_blob::{
41 AccessControlEntry, AceFlagSet, AcePermSet, AceQualifierType, AceTag, EntryAclBlob,
42 EntryXatBlob, NamedBlobEntry,
43};
44pub use aa_entry_stream::{EntryAttributes, EntryMessage, PathList};
45pub use aa_field_key::{FieldKey, FieldKeySet};
46pub use aa_header::{
47 BlobDescription, EntryType, FieldType, HashFunction, HashValue, Header, HeaderFieldValue,
48 Timespec,
49};
50pub use aea::{
51 AeaAuthData, AeaChecksumMode, AeaCiphersuite, AeaContext, AeaContextField,
52 AeaContextFieldRepresentation, AeaEncryptionMode, AeaPadding, AeaProfile, AeaSignatureMode,
53};
54pub use compression_decode::{
55 compression_decode_buffer, compression_decode_scratch_buffer_size, decompress,
56};
57pub use compression_encode::{
58 compress, compression_encode_buffer, compression_encode_scratch_buffer_size,
59};
60pub use compression_stream::{CompressionStream, Decoder, Encoder, StreamOperation};
61pub use error::{CompressionError, Result};
62
63#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
64pub enum Algorithm {
65 Lz4,
66 Zlib,
67 Lzma,
68 Lz4Raw,
69 Brotli,
70 Lzfse,
71 Lzbitmap,
72}
73
74impl Algorithm {
75 pub const ALL: [Self; 5] = [Self::Lz4, Self::Zlib, Self::Lzma, Self::Brotli, Self::Lzfse];
76 pub const BUFFER_ALL: [Self; 7] = [
77 Self::Lz4,
78 Self::Zlib,
79 Self::Lzma,
80 Self::Lz4Raw,
81 Self::Brotli,
82 Self::Lzfse,
83 Self::Lzbitmap,
84 ];
85
86 pub const fn supports_streams(self) -> bool {
87 !matches!(self, Self::Lz4Raw | Self::Lzbitmap)
88 }
89
90 pub(crate) const fn as_raw(self) -> u32 {
91 match self {
92 Self::Lz4 => 0x100,
93 Self::Zlib => 0x205,
94 Self::Lzma => 0x306,
95 Self::Lz4Raw => 0x101,
96 Self::Brotli => 0xB02,
97 Self::Lzfse => 0x801,
98 Self::Lzbitmap => 0x702,
99 }
100 }
101}