@@ -6,11 +6,12 @@ use rustc_span::symbol::Symbol;
6
6
7
7
use object:: read:: archive:: ArchiveFile ;
8
8
9
- use std:: fmt:: Display ;
10
9
use std:: fs:: File ;
11
10
use std:: io;
12
11
use std:: path:: { Path , PathBuf } ;
13
12
13
+ use crate :: errors:: { ExtractBundledLibsError , ExtractBundledLibsErrorKind :: * } ;
14
+
14
15
pub trait ArchiveBuilderBuilder {
15
16
fn new_archive_builder < ' a > ( & self , sess : & ' a Session ) -> Box < dyn ArchiveBuilder < ' a > + ' a > ;
16
17
@@ -28,32 +29,54 @@ pub trait ArchiveBuilderBuilder {
28
29
is_direct_dependency : bool ,
29
30
) -> PathBuf ;
30
31
31
- fn extract_bundled_libs (
32
- & self ,
33
- rlib : & Path ,
32
+ fn extract_bundled_libs < ' a > (
33
+ & ' a self ,
34
+ rlib : & ' a Path ,
34
35
outdir : & Path ,
35
36
bundled_lib_file_names : & FxHashSet < Symbol > ,
36
- ) -> Result < ( ) , String > {
37
- let message = |msg : & str , e : & dyn Display | format ! ( "{} '{}': {}" , msg, & rlib. display( ) , e) ;
37
+ ) -> Result < ( ) , ExtractBundledLibsError < ' _ > > {
38
38
let archive_map = unsafe {
39
- Mmap :: map ( File :: open ( rlib) . map_err ( |e| message ( "failed to open file" , & e) ) ?)
40
- . map_err ( |e| message ( "failed to mmap file" , & e) ) ?
39
+ Mmap :: map ( File :: open ( rlib) . map_err ( |e| ExtractBundledLibsError {
40
+ kind : OpenFile ,
41
+ rlib,
42
+ error : e. to_string ( ) ,
43
+ } ) ?)
44
+ . map_err ( |e| ExtractBundledLibsError {
45
+ kind : MmapFile ,
46
+ rlib,
47
+ error : e. to_string ( ) ,
48
+ } ) ?
41
49
} ;
42
- let archive = ArchiveFile :: parse ( & * archive_map)
43
- . map_err ( |e| message ( "failed to parse archive" , & e) ) ?;
50
+ let archive = ArchiveFile :: parse ( & * archive_map) . map_err ( |e| ExtractBundledLibsError {
51
+ kind : ParseArchive ,
52
+ rlib,
53
+ error : e. to_string ( ) ,
54
+ } ) ?;
44
55
45
56
for entry in archive. members ( ) {
46
- let entry = entry. map_err ( |e| message ( "failed to read entry" , & e) ) ?;
47
- let data = entry
48
- . data ( & * archive_map)
49
- . map_err ( |e| message ( "failed to get data from archive member" , & e) ) ?;
50
- let name = std:: str:: from_utf8 ( entry. name ( ) )
51
- . map_err ( |e| message ( "failed to convert name" , & e) ) ?;
57
+ let entry = entry. map_err ( |e| ExtractBundledLibsError {
58
+ kind : ReadEntry ,
59
+ rlib,
60
+ error : e. to_string ( ) ,
61
+ } ) ?;
62
+ let data = entry. data ( & * archive_map) . map_err ( |e| ExtractBundledLibsError {
63
+ kind : ArchiveMember ,
64
+ rlib,
65
+ error : e. to_string ( ) ,
66
+ } ) ?;
67
+ let name = std:: str:: from_utf8 ( entry. name ( ) ) . map_err ( |e| ExtractBundledLibsError {
68
+ kind : ConvertName ,
69
+ rlib,
70
+ error : e. to_string ( ) ,
71
+ } ) ?;
52
72
if !bundled_lib_file_names. contains ( & Symbol :: intern ( name) ) {
53
73
continue ; // We need to extract only native libraries.
54
74
}
55
- std:: fs:: write ( & outdir. join ( & name) , data)
56
- . map_err ( |e| message ( "failed to write file" , & e) ) ?;
75
+ std:: fs:: write ( & outdir. join ( & name) , data) . map_err ( |e| ExtractBundledLibsError {
76
+ kind : WriteFile ,
77
+ rlib,
78
+ error : e. to_string ( ) ,
79
+ } ) ?;
57
80
}
58
81
Ok ( ( ) )
59
82
}
0 commit comments