1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//! A unified interface for extracting common archive formats in-memory.
//!
//! This crate provides a simple, safe API for extracting various archive formats
//! including ZIP, TAR (with multiple compression options), 7-Zip, and single-file
//! compression formats. All extraction happens in-memory without touching the disk.
//!
//! # Features
//!
//! - **Unified API**: Single interface for all archive formats
//! - **In-memory extraction**: No disk I/O required
//! - **Safety limits**: Protection against zip bombs and resource exhaustion
//! - **Pure Rust**: Minimal C dependencies (only bzip2)
//! - **Cross-platform**: Works on Linux, macOS, Windows (x86_64, ARM64)
//!
//! # Supported Formats
//!
//! - **ZIP** (`.zip`)
//! - **TAR** (`.tar`, `.tar.gz`, `.tar.bz2`, `.tar.xz`, `.tar.zst`, `.tar.lz4`)
//! - **7-Zip** (`.7z`)
//! - **Single-file compression** (`.gz`, `.bz2`, `.xz`, `.lz4`, `.zst`)
//!
//! # Examples
//!
//! ## Basic Usage
//!
//! ```no_run
//! use archive::{ArchiveExtractor, ArchiveFormat};
//! use std::fs;
//!
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! // Read archive file
//! let data = fs::read("example.zip")?;
//!
//! // Create extractor with default settings
//! let extractor = ArchiveExtractor::new();
//!
//! // Extract all files
//! let files = extractor.extract(&data, ArchiveFormat::Zip)?;
//!
//! // Process extracted files
//! for file in files {
//! if !file.is_directory {
//! println!("File: {} ({} bytes)", file.path, file.data.len());
//! }
//! }
//! # Ok(())
//! # }
//! ```
//!
//! ## Custom Size Limits
//!
//! Protect against zip bombs and resource exhaustion:
//!
//! ```no_run
//! use archive::{ArchiveExtractor, ArchiveFormat};
//!
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! # let data = vec![0u8; 100];
//! let extractor = ArchiveExtractor::new()
//! .with_max_file_size(50 * 1024 * 1024) // 50 MB per file
//! .with_max_total_size(500 * 1024 * 1024); // 500 MB total
//!
//! let files = extractor.extract(&data, ArchiveFormat::Zip)?;
//! # Ok(())
//! # }
//! ```
//!
//! ## Multiple Archive Formats
//!
//! ```no_run
//! use archive::{ArchiveExtractor, ArchiveFormat};
//!
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let extractor = ArchiveExtractor::new();
//!
//! // Extract ZIP archive
//! # let zip_data = vec![0u8; 100];
//! let zip_files = extractor.extract(&zip_data, ArchiveFormat::Zip)?;
//!
//! // Extract TAR.GZ archive
//! # let targz_data = vec![0u8; 100];
//! let tar_files = extractor.extract(&targz_data, ArchiveFormat::TarGz)?;
//!
//! // Extract 7-Zip archive
//! # let sevenz_data = vec![0u8; 100];
//! let seven_files = extractor.extract(&sevenz_data, ArchiveFormat::SevenZ)?;
//!
//! // Decompress single gzip file
//! # let gz_data = vec![0u8; 100];
//! let gz_files = extractor.extract(&gz_data, ArchiveFormat::Gz)?;
//! # Ok(())
//! # }
//! ```
//!
//! # Safety
//!
//! This crate includes built-in protections against:
//! - **Zip bombs**: Files that expand to enormous sizes
//! - **Resource exhaustion**: Configurable size limits
//! - **Path traversal**: Safe handling of archive paths
//!
//! Default limits:
//! - Maximum file size: 100 MB
//! - Maximum total extraction size: 1 GB
//!
//! # Error Handling
//!
//! ```no_run
//! use archive::{ArchiveExtractor, ArchiveFormat, ArchiveError};
//!
//! # fn main() {
//! let extractor = ArchiveExtractor::new()
//! .with_max_file_size(1024 * 1024); // 1 MB limit
//!
//! # let data = vec![0u8; 100];
//! match extractor.extract(&data, ArchiveFormat::Zip) {
//! Ok(files) => println!("Extracted {} files", files.len()),
//! Err(ArchiveError::FileTooLarge { size, limit }) => {
//! eprintln!("File too large: {} bytes (limit: {})", size, limit);
//! }
//! Err(e) => eprintln!("Extraction failed: {}", e),
//! }
//! # }
//! ```
pub use ;
pub use ;
pub use ArchiveFormat;