@@ -2,7 +2,7 @@ use std::env;
2
2
use std:: error;
3
3
use std:: fmt;
4
4
use std:: fs;
5
- use std:: io:: { self , BufRead } ;
5
+ use std:: io;
6
6
use std:: str;
7
7
use std:: sync:: atomic:: { AtomicBool , Ordering } ;
8
8
@@ -15,36 +15,14 @@ pub fn used_unstable_argsfile() -> bool {
15
15
USED_ARGSFILE_FEATURE . load ( Ordering :: Relaxed )
16
16
}
17
17
18
- struct FileArgs {
19
- path : String ,
20
- input : Vec < u8 > ,
21
- }
22
-
23
- impl FileArgs {
24
- fn new ( path : String , input : Vec < u8 > ) -> Self {
25
- FileArgs { path, input }
26
- }
27
-
28
- fn lines ( self ) -> impl Iterator < Item = Result < String , Error > > {
29
- let Self { input, path } = self ;
30
- io:: Cursor :: new ( input) . lines ( ) . map ( move |res| {
31
- let path = path. clone ( ) ;
32
- res. map_err ( move |err| match err. kind ( ) {
33
- io:: ErrorKind :: InvalidData => Error :: Utf8Error ( Some ( path) ) ,
34
- _ => Error :: IOError ( path, err) ,
35
- } )
36
- } )
37
- }
38
- }
39
-
40
18
pub struct ArgsIter {
41
19
base : env:: ArgsOs ,
42
- file : Option < Box < dyn Iterator < Item = Result < String , Error > > > > ,
20
+ file : std :: vec :: IntoIter < String > ,
43
21
}
44
22
45
23
impl ArgsIter {
46
24
pub fn new ( ) -> Self {
47
- ArgsIter { base : env:: args_os ( ) , file : None }
25
+ ArgsIter { base : env:: args_os ( ) , file : vec ! [ ] . into_iter ( ) }
48
26
}
49
27
}
50
28
@@ -53,11 +31,8 @@ impl Iterator for ArgsIter {
53
31
54
32
fn next ( & mut self ) -> Option < Self :: Item > {
55
33
loop {
56
- if let Some ( ref mut file) = & mut self . file {
57
- match file. next ( ) {
58
- Some ( res) => return Some ( res. map_err ( From :: from) ) ,
59
- None => self . file = None ,
60
- }
34
+ if let Some ( line) = self . file . next ( ) {
35
+ return Some ( Ok ( line) ) ;
61
36
}
62
37
63
38
let arg =
@@ -66,14 +41,18 @@ impl Iterator for ArgsIter {
66
41
Some ( Err ( err) ) => return Some ( Err ( err) ) ,
67
42
Some ( Ok ( ref arg) ) if arg. starts_with ( "@" ) => {
68
43
let path = & arg[ 1 ..] ;
69
- let lines = match fs:: read ( path) {
44
+ let file = match fs:: read_to_string ( path) {
70
45
Ok ( file) => {
71
46
USED_ARGSFILE_FEATURE . store ( true , Ordering :: Relaxed ) ;
72
- FileArgs :: new ( path. to_string ( ) , file) . lines ( )
47
+ file
48
+ }
49
+ Err ( ref err) if err. kind ( ) == io:: ErrorKind :: InvalidData => {
50
+ return Some ( Err ( Error :: Utf8Error ( Some ( path. to_string ( ) ) ) ) ) ;
73
51
}
74
52
Err ( err) => return Some ( Err ( Error :: IOError ( path. to_string ( ) , err) ) ) ,
75
53
} ;
76
- self . file = Some ( Box :: new ( lines) ) ;
54
+ self . file =
55
+ file. lines ( ) . map ( ToString :: to_string) . collect :: < Vec < _ > > ( ) . into_iter ( ) ;
77
56
}
78
57
Some ( Ok ( arg) ) => return Some ( Ok ( arg) ) ,
79
58
None => return None ,
0 commit comments