use std::env;
use std::process::ExitCode;
use bee::api::{RedundantUploadOptions, UploadOptions};
use bee::swarm::BatchId;
use bee::{Client, Error};
use bytes::Bytes;
#[tokio::main]
async fn main() -> ExitCode {
match run().await {
Ok(()) => ExitCode::SUCCESS,
Err(e) => {
eprintln!("error: {e}");
ExitCode::FAILURE
}
}
}
async fn run() -> Result<(), Error> {
let url = env::var("BEE_URL").unwrap_or_else(|_| "http://localhost:1633".into());
let batch_hex =
env::var("BEE_BATCH_ID").map_err(|_| Error::argument("BEE_BATCH_ID is required"))?;
let batch_id = BatchId::from_hex(&batch_hex)?;
let client = Client::new(&url)?;
let payload = Bytes::from_static(b"some sensitive payload");
let plain = client
.file()
.upload_data(&batch_id, payload.clone(), None)
.await?;
println!(
"plain reference: {} ({} bytes)",
plain.reference.to_hex(),
plain.reference.len()
);
let opts = RedundantUploadOptions {
base: UploadOptions {
encrypt: Some(true),
..Default::default()
},
..Default::default()
};
let enc = client
.file()
.upload_data(&batch_id, payload.clone(), Some(&opts))
.await?;
println!(
"encrypted reference: {} ({} bytes, encrypted={})",
enc.reference.to_hex(),
enc.reference.len(),
enc.reference.is_encrypted()
);
let body = client.file().download_data(&enc.reference, None).await?;
if body == payload {
println!("round-trip ok ({} bytes match)", body.len());
} else {
return Err(Error::argument("round-trip mismatch"));
}
Ok(())
}