use holt::TreeBuilder;
fn main() {
println!("=== holt s3_metadata example ===\n");
let tree = TreeBuilder::new("scratch").memory().open().expect("open");
let rows: &[(&[u8], &[u8])] = &[
(
b"photos/users/alice/01.jpg",
br#"{"size":2345678,"etag":"\"d41d8cd98f00\"","class":"STANDARD"}"#,
),
(
b"photos/users/alice/02.jpg",
br#"{"size":1234567,"etag":"\"098f6bcd4621\"","class":"STANDARD"}"#,
),
(
b"photos/users/bob/profile.png",
br#"{"size":456789,"etag":"\"7f8c0a3b4d5e\"","class":"STANDARD"}"#,
),
(
b"backups/db/2026-05/snapshot.tar.zst",
br#"{"size":1073741824,"etag":"\"deadbeefcafe\"","class":"GLACIER"}"#,
),
(
b"logs/2026-05-19/api.log.gz",
br#"{"size":98765,"etag":"\"fedcba987654\"","class":"STANDARD_IA"}"#,
),
];
for (key, value) in rows {
tree.put(key, value).unwrap();
}
println!("indexed {} objects across 3 buckets\n", rows.len());
let key: &[u8] = b"photos/users/alice/01.jpg";
let meta = tree.get(key).unwrap().expect("present");
println!(
"HeadObject {:?} -> {}",
std::str::from_utf8(key).unwrap(),
std::str::from_utf8(&meta).unwrap(),
);
tree.rename(
b"photos/users/alice/01.jpg",
b"photos/archive/users/alice/01.jpg",
false,
)
.unwrap();
assert!(tree.get(b"photos/users/alice/01.jpg").unwrap().is_none());
println!("moved alice/01.jpg into archive/");
let prev = tree
.remove(b"logs/2026-05-19/api.log.gz")
.unwrap()
.map(|v| v.len())
.unwrap_or(0);
println!("deleted log.gz -> previous = {prev} bytes");
tree.checkpoint().unwrap();
println!("\ndone");
}