···88[crates-badge]: https://img.shields.io/crates/v/repo-stream.svg
99[docs-badge]: https://docs.rs/repo-stream/badge.svg
10101111+```rust
1212+use repo_stream::{Driver, DriverBuilder, DriveError, DiskBuilder};
1313+1414+#[tokio::main]
1515+async fn main() -> Result<(), DriveError> {
1616+ // repo-stream takes any AsyncRead as input, like a tokio::fs::File
1717+ let reader = tokio::fs::File::open("repo.car".into()).await?;
1818+ let reader = tokio::io::BufReader::new(reader);
1919+2020+ // example repo workload is simply counting the total record bytes
2121+ let mut total_size = 0;
2222+2323+ match DriverBuilder::new()
2424+ .with_mem_limit_mb(10)
2525+ .with_block_processor(|rec| rec.len()) // block processing: just extract the raw record size
2626+ .load_car(reader)
2727+ .await?
2828+ {
2929+3030+ // if all blocks fit within memory
3131+ Driver::Memory(_commit, mut driver) => {
3232+ while let Some(chunk) = driver.next_chunk(256).await? {
3333+ for (_rkey, size) in chunk {
3434+ total_size += size;
3535+ }
3636+ }
3737+ },
3838+3939+ // if the CAR was too big for in-memory processing
4040+ Driver::Disk(paused) => {
4141+ // set up a disk store we can spill to
4242+ let store = DiskBuilder::new().open("some/path.db".into()).await?;
4343+ // do the spilling, get back a (similar) driver
4444+ let (_commit, mut driver) = paused.finish_loading(store).await?;
4545+4646+ while let Some(chunk) = driver.next_chunk(256).await? {
4747+ for (_rkey, size) in chunk {
4848+ total_size += size;
4949+ }
5050+ }
5151+5252+ // clean up the disk store (drop tables etc)
5353+ driver.reset_store().await?;
5454+ }
5555+ };
5656+ println!("sum of size of all records: {total_size}");
5757+ Ok(())
5858+}
5959+```
11601261more recent todo
1362