@@ -287,10 +287,70 @@ mod find {
287
287
. ok_or_else ( || find:: existing:: Error :: NotFound { oid : id. to_owned ( ) } )
288
288
}
289
289
290
+ /// Like [`find(…)`][Self::find()], but flattens the `Result<Option<_>>` into a single `Result` making a non-existing object an error
291
+ /// while returning the desired object type.
292
+ fn find_blob < ' a > (
293
+ & self ,
294
+ id : & gix_hash:: oid ,
295
+ buffer : & ' a mut Vec < u8 > ,
296
+ ) -> Result < BlobRef < ' a > , find:: existing_object:: Error > {
297
+ if id == gix_hash:: ObjectId :: empty_blob ( id. kind ( ) ) {
298
+ return Ok ( BlobRef { data : & [ ] } ) ;
299
+ }
300
+ self . try_find ( id, buffer)
301
+ . map_err ( find:: existing_object:: Error :: Find ) ?
302
+ . ok_or_else ( || find:: existing_object:: Error :: NotFound {
303
+ oid : id. as_ref ( ) . to_owned ( ) ,
304
+ } )
305
+ . and_then ( |o| {
306
+ o. decode ( ) . map_err ( |err| find:: existing_object:: Error :: Decode {
307
+ source : err,
308
+ oid : id. as_ref ( ) . to_owned ( ) ,
309
+ } )
310
+ } )
311
+ . and_then ( |o| match o {
312
+ ObjectRef :: Blob ( o) => Ok ( o) ,
313
+ o => Err ( find:: existing_object:: Error :: ObjectKind {
314
+ oid : id. as_ref ( ) . to_owned ( ) ,
315
+ actual : o. kind ( ) ,
316
+ expected : Kind :: Blob ,
317
+ } ) ,
318
+ } )
319
+ }
320
+
321
+ /// Like [`find(…)`][Self::find()], but flattens the `Result<Option<_>>` into a single `Result` making a non-existing object an error
322
+ /// while returning the desired object type.
323
+ fn find_tree < ' a > (
324
+ & self ,
325
+ id : & gix_hash:: oid ,
326
+ buffer : & ' a mut Vec < u8 > ,
327
+ ) -> Result < TreeRef < ' a > , find:: existing_object:: Error > {
328
+ if id == gix_hash:: ObjectId :: empty_tree ( id. kind ( ) ) {
329
+ return Ok ( TreeRef { entries : Vec :: new ( ) } ) ;
330
+ }
331
+ self . try_find ( id, buffer)
332
+ . map_err ( find:: existing_object:: Error :: Find ) ?
333
+ . ok_or_else ( || find:: existing_object:: Error :: NotFound {
334
+ oid : id. as_ref ( ) . to_owned ( ) ,
335
+ } )
336
+ . and_then ( |o| {
337
+ o. decode ( ) . map_err ( |err| find:: existing_object:: Error :: Decode {
338
+ source : err,
339
+ oid : id. as_ref ( ) . to_owned ( ) ,
340
+ } )
341
+ } )
342
+ . and_then ( |o| match o {
343
+ ObjectRef :: Tree ( o) => Ok ( o) ,
344
+ o => Err ( find:: existing_object:: Error :: ObjectKind {
345
+ oid : id. as_ref ( ) . to_owned ( ) ,
346
+ actual : o. kind ( ) ,
347
+ expected : Kind :: Tree ,
348
+ } ) ,
349
+ } )
350
+ }
351
+
290
352
make_obj_lookup ! ( find_commit, ObjectRef :: Commit , Kind :: Commit , CommitRef <' a>) ;
291
- make_obj_lookup ! ( find_tree, ObjectRef :: Tree , Kind :: Tree , TreeRef <' a>) ;
292
353
make_obj_lookup ! ( find_tag, ObjectRef :: Tag , Kind :: Tag , TagRef <' a>) ;
293
- make_obj_lookup ! ( find_blob, ObjectRef :: Blob , Kind :: Blob , BlobRef <' a>) ;
294
354
make_iter_lookup ! ( find_commit_iter, Kind :: Commit , CommitRefIter <' a>, try_into_commit_iter) ;
295
355
make_iter_lookup ! ( find_tree_iter, Kind :: Tree , TreeRefIter <' a>, try_into_tree_iter) ;
296
356
make_iter_lookup ! ( find_tag_iter, Kind :: Tag , TagRefIter <' a>, try_into_tag_iter) ;
0 commit comments