@@ -5,13 +5,14 @@ use crate::{
5
5
densemap, densemap:: DenseMap , graph:: BuildId , graph:: FileId , graph:: Graph , graph:: Hashes ,
6
6
hash:: BuildHash ,
7
7
} ;
8
- use anyhow:: { anyhow , bail} ;
8
+ use anyhow:: bail;
9
9
use std:: collections:: HashMap ;
10
10
use std:: fs:: File ;
11
11
use std:: io:: BufReader ;
12
12
use std:: io:: Read ;
13
13
use std:: io:: Write ;
14
14
use std:: path:: Path ;
15
+ use std:: path:: PathBuf ;
15
16
16
17
const VERSION : u32 = 1 ;
17
18
@@ -303,21 +304,75 @@ impl<'a> Reader<'a> {
303
304
}
304
305
}
305
306
307
+ #[ derive( Debug ) ]
308
+ pub struct OpenError {
309
+ path : PathBuf ,
310
+ source : OpenErrorKind ,
311
+ }
312
+
313
+ impl std:: fmt:: Display for OpenError {
314
+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
315
+ write ! ( f, "failed to open {}" , self . path. display( ) )
316
+ }
317
+ }
318
+
319
+ impl std:: error:: Error for OpenError {
320
+ fn source ( & self ) -> Option < & ( dyn std:: error:: Error + ' static ) > {
321
+ Some ( & self . source )
322
+ }
323
+ }
324
+
325
+ #[ derive( Debug ) ]
326
+ enum OpenErrorKind {
327
+ OpenDB ( std:: io:: Error ) ,
328
+ ReadDB ( anyhow:: Error ) ,
329
+ CreateDB ( std:: io:: Error ) ,
330
+ }
331
+
332
+ impl std:: fmt:: Display for OpenErrorKind {
333
+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
334
+ match self {
335
+ OpenErrorKind :: OpenDB ( _) => write ! ( f, "failed to open" ) ,
336
+ OpenErrorKind :: ReadDB ( _) => write ! ( f, "failed to read" ) ,
337
+ OpenErrorKind :: CreateDB ( _) => write ! ( f, "failed to create" ) ,
338
+ }
339
+ }
340
+ }
341
+
342
+ impl std:: error:: Error for OpenErrorKind {
343
+ fn source ( & self ) -> Option < & ( dyn std:: error:: Error + ' static ) > {
344
+ match self {
345
+ OpenErrorKind :: OpenDB ( err) => Some ( err) ,
346
+ OpenErrorKind :: ReadDB ( err) => Some ( err. as_ref ( ) ) ,
347
+ OpenErrorKind :: CreateDB ( err) => Some ( err) ,
348
+ }
349
+ }
350
+ }
351
+
306
352
/// Opens or creates an on-disk database, loading its state into the provided Graph.
307
- pub fn open ( path : & Path , graph : & mut Graph , hashes : & mut Hashes ) -> anyhow :: Result < Writer > {
353
+ pub fn open ( path : & Path , graph : & mut Graph , hashes : & mut Hashes ) -> Result < Writer , OpenError > {
308
354
match std:: fs:: OpenOptions :: new ( )
309
355
. read ( true )
310
356
. append ( true )
311
357
. open ( path)
312
358
{
313
359
Ok ( mut f) => {
314
- let ids = Reader :: read ( & mut f, graph, hashes) ?;
360
+ let ids = Reader :: read ( & mut f, graph, hashes) . map_err ( |err| OpenError {
361
+ path : path. to_path_buf ( ) ,
362
+ source : OpenErrorKind :: ReadDB ( err) ,
363
+ } ) ?;
315
364
Ok ( Writer :: from_opened ( ids, f) )
316
365
}
317
366
Err ( err) if err. kind ( ) == std:: io:: ErrorKind :: NotFound => {
318
- let w = Writer :: create ( path) ?;
367
+ let w = Writer :: create ( path) . map_err ( |err| OpenError {
368
+ path : path. to_path_buf ( ) ,
369
+ source : OpenErrorKind :: CreateDB ( err) ,
370
+ } ) ?;
319
371
Ok ( w)
320
372
}
321
- Err ( err) => Err ( anyhow ! ( err) ) ,
373
+ Err ( err) => Err ( OpenError {
374
+ path : path. to_path_buf ( ) ,
375
+ source : OpenErrorKind :: OpenDB ( err) ,
376
+ } ) ,
322
377
}
323
378
}
0 commit comments