@@ -6,11 +6,12 @@ use rustc_span::symbol::Symbol;
66
77use object:: read:: archive:: ArchiveFile ;
88
9- use std:: fmt:: Display ;
109use std:: fs:: File ;
1110use std:: io;
1211use std:: path:: { Path , PathBuf } ;
1312
13+ use crate :: errors:: { ExtractBundledLibsError , ExtractBundledLibsErrorKind :: * } ;
14+
1415pub trait ArchiveBuilderBuilder {
1516 fn new_archive_builder < ' a > ( & self , sess : & ' a Session ) -> Box < dyn ArchiveBuilder < ' a > + ' a > ;
1617
@@ -28,32 +29,54 @@ pub trait ArchiveBuilderBuilder {
2829 is_direct_dependency : bool ,
2930 ) -> PathBuf ;
3031
31- fn extract_bundled_libs (
32- & self ,
33- rlib : & Path ,
32+ fn extract_bundled_libs < ' a > (
33+ & ' a self ,
34+ rlib : & ' a Path ,
3435 outdir : & Path ,
3536 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 < ' _ > > {
3838 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+ } ) ?
4149 } ;
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+ } ) ?;
4455
4556 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+ } ) ?;
5272 if !bundled_lib_file_names. contains ( & Symbol :: intern ( name) ) {
5373 continue ; // We need to extract only native libraries.
5474 }
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+ } ) ?;
5780 }
5881 Ok ( ( ) )
5982 }
0 commit comments