@@ -10,7 +10,8 @@ use crate::Target;
1010
1111#[ derive( Debug ) ]
1212pub struct Args {
13- pub all : Vec < String > ,
13+ pub cargo_args : Vec < String > ,
14+ pub rest_args : Vec < String > ,
1415 pub subcommand : Option < Subcommand > ,
1516 pub channel : Option < String > ,
1617 pub target : Option < Target > ,
@@ -163,7 +164,8 @@ pub fn parse(target_list: &TargetList) -> Result<Args> {
163164 let mut manifest_path: Option < PathBuf > = None ;
164165 let mut target_dir = None ;
165166 let mut sc = None ;
166- let mut all: Vec < String > = Vec :: new ( ) ;
167+ let mut cargo_args: Vec < String > = Vec :: new ( ) ;
168+ let mut rest_args: Vec < String > = Vec :: new ( ) ;
167169 let mut version = false ;
168170 let mut quiet = false ;
169171 let mut verbose = 0 ;
@@ -176,69 +178,98 @@ pub fn parse(target_list: &TargetList) -> Result<Args> {
176178 continue ;
177179 }
178180 if matches ! ( arg. as_str( ) , "--" ) {
179- all . push ( arg) ;
180- all . extend ( args. by_ref ( ) ) ;
181+ rest_args . push ( arg) ;
182+ rest_args . extend ( args. by_ref ( ) ) ;
181183 } else if let v @ 1 .. = is_verbose ( arg. as_str ( ) ) {
182184 verbose += v;
183- all . push ( arg) ;
185+ cargo_args . push ( arg) ;
184186 } else if matches ! ( arg. as_str( ) , "--version" | "-V" ) {
185187 version = true ;
186188 } else if matches ! ( arg. as_str( ) , "--quiet" | "-q" ) {
187189 quiet = true ;
188- all . push ( arg) ;
190+ cargo_args . push ( arg) ;
189191 } else if let Some ( kind) = is_value_arg ( & arg, "--color" ) {
190192 color = match kind {
191193 ArgKind :: Next => {
192- match parse_next_arg ( arg, & mut all, str_to_owned, identity, & mut args) ? {
194+ match parse_next_arg (
195+ arg,
196+ & mut cargo_args,
197+ str_to_owned,
198+ identity,
199+ & mut args,
200+ ) ? {
193201 Some ( c) => Some ( c) ,
194202 None => shell:: invalid_color ( None ) ,
195203 }
196204 }
197- ArgKind :: Equal => Some ( parse_equal_arg ( arg, & mut all, str_to_owned, identity) ?) ,
205+ ArgKind :: Equal => Some ( parse_equal_arg (
206+ arg,
207+ & mut cargo_args,
208+ str_to_owned,
209+ identity,
210+ ) ?) ,
198211 } ;
199212 } else if let Some ( kind) = is_value_arg ( & arg, "--manifest-path" ) {
200213 manifest_path = match kind {
201214 ArgKind :: Next => parse_next_arg (
202215 arg,
203- & mut all ,
216+ & mut cargo_args ,
204217 parse_manifest_path,
205218 store_manifest_path,
206219 & mut args,
207220 ) ?
208221 . flatten ( ) ,
209- ArgKind :: Equal => {
210- parse_equal_arg ( arg, & mut all, parse_manifest_path, store_manifest_path) ?
211- }
222+ ArgKind :: Equal => parse_equal_arg (
223+ arg,
224+ & mut cargo_args,
225+ parse_manifest_path,
226+ store_manifest_path,
227+ ) ?,
212228 } ;
213229 } else if let ( "+" , ch) = arg. split_at ( 1 ) {
214230 channel = Some ( ch. to_owned ( ) ) ;
215231 } else if let Some ( kind) = is_value_arg ( & arg, "--target" ) {
216232 let parse_target = |t : & str | Ok ( Target :: from ( t, target_list) ) ;
217233 target = match kind {
218234 ArgKind :: Next => {
219- parse_next_arg ( arg, & mut all , parse_target, identity, & mut args) ?
235+ parse_next_arg ( arg, & mut cargo_args , parse_target, identity, & mut args) ?
220236 }
221- ArgKind :: Equal => Some ( parse_equal_arg ( arg, & mut all, parse_target, identity) ?) ,
237+ ArgKind :: Equal => Some ( parse_equal_arg (
238+ arg,
239+ & mut cargo_args,
240+ parse_target,
241+ identity,
242+ ) ?) ,
222243 } ;
223244 } else if let Some ( kind) = is_value_arg ( & arg, "--features" ) {
224245 match kind {
225246 ArgKind :: Next => {
226- let next =
227- parse_next_arg ( arg, & mut all, str_to_owned, identity, & mut args) ?;
247+ let next = parse_next_arg (
248+ arg,
249+ & mut cargo_args,
250+ str_to_owned,
251+ identity,
252+ & mut args,
253+ ) ?;
228254 if let Some ( feature) = next {
229255 features. push ( feature) ;
230256 }
231257 }
232258 ArgKind :: Equal => {
233- features. push ( parse_equal_arg ( arg, & mut all, str_to_owned, identity) ?) ;
259+ features. push ( parse_equal_arg (
260+ arg,
261+ & mut cargo_args,
262+ str_to_owned,
263+ identity,
264+ ) ?) ;
234265 }
235266 }
236267 } else if let Some ( kind) = is_value_arg ( & arg, "--target-dir" ) {
237268 match kind {
238269 ArgKind :: Next => {
239270 target_dir = parse_next_arg (
240271 arg,
241- & mut all ,
272+ & mut cargo_args ,
242273 parse_target_dir,
243274 store_target_dir,
244275 & mut args,
@@ -247,7 +278,7 @@ pub fn parse(target_list: &TargetList) -> Result<Args> {
247278 ArgKind :: Equal => {
248279 target_dir = Some ( parse_equal_arg (
249280 arg,
250- & mut all ,
281+ & mut cargo_args ,
251282 parse_target_dir,
252283 store_target_dir,
253284 ) ?) ;
@@ -258,13 +289,14 @@ pub fn parse(target_list: &TargetList) -> Result<Args> {
258289 sc = Some ( Subcommand :: from ( arg. as_ref ( ) ) ) ;
259290 }
260291
261- all . push ( arg. clone ( ) ) ;
292+ cargo_args . push ( arg. clone ( ) ) ;
262293 }
263294 }
264295 }
265296
266297 Ok ( Args {
267- all,
298+ cargo_args,
299+ rest_args,
268300 subcommand : sc,
269301 channel,
270302 target,
0 commit comments