···4242 .load_car(reader)
4343 .await?
4444 {
4545- None => panic!("empty mst! try a bigger car"),
4646- Some(Driver::Memory(_, _)) => panic!("try this on a bigger car"),
4747- Some(Driver::Disk(big_stuff)) => {
4545+ Driver::Memory(_, _) => panic!("try this on a bigger car"),
4646+ Driver::Disk(big_stuff) => {
4847 // we reach here if the repo was too big and needs to be spilled to
4948 // disk to continue
5049
+8-7
examples/read-file/main.rs
···2323 let reader = tokio::fs::File::open(file).await?;
2424 let reader = tokio::io::BufReader::new(reader);
25252626- let (commit, mut driver) = match DriverBuilder::new()
2626+ let (commit, driver) = match DriverBuilder::new()
2727 .with_block_processor(|block| block.len().to_ne_bytes().to_vec())
2828 .load_car(reader)
2929 .await?
3030 {
3131- None => todo!(),
3232- Some(Driver::Memory(commit, mem_driver)) => (commit, mem_driver),
3333- Some(Driver::Disk(_)) => panic!("this example doesn't handle big CARs"),
3131+ Driver::Memory(commit, mem_driver) => (commit, mem_driver),
3232+ Driver::Disk(_) => panic!("this example doesn't handle big CARs"),
3433 };
35343635 log::info!("got commit: {commit:?}");
37363837 let mut n = 0;
3939- while let Some(pairs) = driver.next_chunk(256).await? {
4040- n += pairs.len();
4141- // log::info!("got {rkey:?}");
3838+ if let Some(mut driver) = driver {
3939+ while let Some(pairs) = driver.next_chunk(256).await? {
4040+ n += pairs.len();
4141+ // log::info!("got {rkey:?}");
4242+ }
4243 }
4344 log::info!("bye! total records={n}");
4445
+11-17
src/drive.rs
···107107 ///
108108 /// You probably want to check the commit's signature. You can go ahead and
109109 /// walk the MST right away.
110110- Memory(Commit, MemDriver),
110110+ Memory(Commit, Option<MemDriver>),
111111 /// Blocks exceed the memory limit
112112 ///
113113 /// You'll need to provide a disk storage to continue. The commit will be
···159159 }
160160 }
161161 /// Begin processing an atproto MST from a CAR file
162162- pub async fn load_car<R: AsyncRead + Unpin>(
163163- &self,
164164- reader: R,
165165- ) -> Result<Option<Driver<R>>, DriveError> {
162162+ pub async fn load_car<R: AsyncRead + Unpin>(&self, reader: R) -> Result<Driver<R>, DriveError> {
166163 Driver::load_car(reader, noop, self.mem_limit_mb).await
167164 }
168165}
···185182 self
186183 }
187184 /// Begin processing an atproto MST from a CAR file
188188- pub async fn load_car<R: AsyncRead + Unpin>(
189189- &self,
190190- reader: R,
191191- ) -> Result<Option<Driver<R>>, DriveError> {
185185+ pub async fn load_car<R: AsyncRead + Unpin>(&self, reader: R) -> Result<Driver<R>, DriveError> {
192186 Driver::load_car(reader, self.block_processor, self.mem_limit_mb).await
193187 }
194188}
···207201 reader: R,
208202 process: fn(Bytes) -> Bytes,
209203 mem_limit_mb: usize,
210210- ) -> Result<Option<Driver<R>>, DriveError> {
204204+ ) -> Result<Driver<R>, DriveError> {
211205 let max_size = mem_limit_mb * 2_usize.pow(20);
212206 let mut mem_blocks = HashMap::new();
213207···240234 mem_size += maybe_processed.len();
241235 mem_blocks.insert(cid, maybe_processed);
242236 if mem_size >= max_size {
243243- return Ok(Some(Driver::Disk(NeedDisk {
237237+ return Ok(Driver::Disk(NeedDisk {
244238 car,
245239 root,
246240 process,
247241 max_size,
248242 mem_blocks,
249243 commit,
250250- })));
244244+ }));
251245 }
252246 }
253247···264258 };
265259 let Some(walker) = Walker::new(root_node) else {
266260 // TODO: actually we still want the commit in this case
267267- return Ok(None);
261261+ return Ok(Driver::Memory(commit, None));
268262 };
269263270270- Ok(Some(Driver::Memory(
264264+ Ok(Driver::Memory(
271265 commit,
272272- MemDriver {
266266+ Some(MemDriver {
273267 blocks: mem_blocks,
274268 walker,
275269 process,
276276- },
277277- )))
270270+ }),
271271+ ))
278272 }
279273}
280274