05_aa_byte_stream_pipeline/
05_aa_byte_stream_pipeline.rs1mod common;
2
3use common::{artifact_dir, path_string, pseudo_random_bytes};
4use compression::{
5 ArchiveCompressionAlgorithm, ArchiveFlags, ByteStream, DEFAULT_FILE_MODE, OPEN_CREATE,
6 OPEN_READ_ONLY, OPEN_TRUNCATE, OPEN_WRITE_ONLY,
7};
8use std::fs;
9
10fn main() -> Result<(), Box<dyn std::error::Error>> {
11 let input = pseudo_random_bytes(32 * 1024);
12 let artifact_dir = artifact_dir("aa-byte-stream");
13 let plain_path = artifact_dir.join("payload.bin");
14 let compressed_path = artifact_dir.join("payload.pbzx");
15 fs::write(&plain_path, &input)?;
16
17 let mut input_stream =
18 ByteStream::open_with_path(&path_string(&plain_path), OPEN_READ_ONLY, 0)?;
19 let compressed_stream = ByteStream::open_with_path(
20 &path_string(&compressed_path),
21 OPEN_WRITE_ONLY | OPEN_CREATE | OPEN_TRUNCATE,
22 DEFAULT_FILE_MODE,
23 )?;
24 let mut compressed_stream = compressed_stream.into_compression_output(
25 ArchiveCompressionAlgorithm::Lzfse,
26 64 * 1024,
27 ArchiveFlags::empty(),
28 0,
29 )?;
30 input_stream.process_into(&mut compressed_stream)?;
31 compressed_stream.close()?;
32
33 let compressed_stream =
34 ByteStream::open_with_path(&path_string(&compressed_path), OPEN_READ_ONLY, 0)?;
35 let mut decompressed_stream =
36 compressed_stream.into_decompression_input(ArchiveFlags::empty(), 0)?;
37 let output = decompressed_stream.read_to_end()?;
38 assert_eq!(output, input);
39 decompressed_stream.close()?;
40
41 let compressed_len = fs::metadata(&compressed_path)?.len();
42 println!("compressed bytes={compressed_len}");
43 println!("✅ AppleArchive byte-stream pipeline OK");
44 Ok(())
45}