use s_zip::{AsyncStreamingZipWriter, Result};
use std::io::Cursor;
#[tokio::main]
async fn main() -> Result<()> {
println!("Async in-memory ZIP example\n");
println!("1. Creating ZIP in memory...");
let zip_bytes = create_in_memory_zip().await?;
println!(" ✅ Created {} bytes in memory", zip_bytes.len());
std::fs::write("async_in_memory.zip", &zip_bytes).unwrap();
println!(" 💾 Saved to async_in_memory.zip for verification");
println!("\n2. Simulating HTTP upload...");
simulate_http_upload(zip_bytes.clone()).await;
println!("\n3. Simulating S3/cloud storage upload...");
simulate_s3_upload(zip_bytes).await;
println!("\n✅ All examples completed successfully!");
println!(" Verify with: unzip -l async_in_memory.zip");
Ok(())
}
async fn create_in_memory_zip() -> Result<Vec<u8>> {
let buffer = Vec::new();
let cursor = Cursor::new(buffer);
let mut writer = AsyncStreamingZipWriter::from_writer(cursor);
writer.start_entry("readme.txt").await?;
writer
.write_data(b"This ZIP was created entirely in memory!\n")
.await?;
writer
.write_data(b"No temporary files were used.\n")
.await?;
writer.start_entry("data/config.json").await?;
let config = r#"{
"app": "s-zip",
"version": "0.3.1",
"async": true,
"in_memory": true
}"#;
writer.write_data(config.as_bytes()).await?;
writer.start_entry("data/sample.csv").await?;
writer.write_data(b"id,name,value\n").await?;
writer.write_data(b"1,Alice,100\n").await?;
writer.write_data(b"2,Bob,200\n").await?;
writer.write_data(b"3,Charlie,300\n").await?;
let cursor = writer.finish().await?;
Ok(cursor.into_inner())
}
async fn simulate_http_upload(zip_bytes: Vec<u8>) {
println!(
" 📤 Uploading {} bytes to HTTP endpoint...",
zip_bytes.len()
);
println!(" Example: POST /api/download with ZIP in body");
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
println!(" ✅ Upload complete!");
println!(" → Response: 200 OK");
println!(" → Content-Type: application/zip");
println!(" → Content-Length: {}", zip_bytes.len());
}
async fn simulate_s3_upload(zip_bytes: Vec<u8>) {
println!(" ☁️ Uploading {} bytes to S3...", zip_bytes.len());
println!(" Bucket: my-bucket");
println!(" Key: exports/data-export.zip");
tokio::time::sleep(tokio::time::Duration::from_millis(150)).await;
println!(" ✅ Upload complete!");
println!(" → ETag: \"abc123def456\"");
println!(" → URL: s3://my-bucket/exports/data.zip");
}