@@ -49,10 +49,13 @@ enum ApkSubCmd {
49
49
/// `cargo` subcommand to run
50
50
cargo_cmd : String ,
51
51
52
+ // This struct will be filled up later by arguments that are intermixed
53
+ // with unknown args and ended up in `cargo_args` below.
54
+ #[ clap( flatten) ]
55
+ args : Args ,
56
+
52
57
/// Arguments passed to cargo. Some arguments will be used to configure
53
58
/// the environment similar to other `cargo apk` commands
54
- // TODO: This enum variant should parse into `Args` as soon as `clap` supports
55
- // parsing
56
59
#[ clap( trailing_var_arg = true , allow_hyphen_values = true ) ]
57
60
cargo_args : Vec < String > ,
58
61
} ,
@@ -74,7 +77,7 @@ enum ApkSubCmd {
74
77
Version ,
75
78
}
76
79
77
- fn split_apk_and_cargo_args ( input : Vec < String > ) -> ( Args , Vec < String > ) {
80
+ fn split_apk_and_cargo_args ( mut args : Args , input : Vec < String > ) -> ( Args , Vec < String > ) {
78
81
// Clap doesn't support parsing unknown args properly
79
82
// https://github.com/clap-rs/clap/issues/1404
80
83
// https://github.com/clap-rs/clap/issues/4498
@@ -124,7 +127,7 @@ fn split_apk_and_cargo_args(input: Vec<String>) -> (Args, Vec<String>) {
124
127
let m = Args :: command ( )
125
128
. no_binary_name ( true )
126
129
. get_matches_from ( & split_args. apk_args ) ;
127
- let args = Args :: from_arg_matches ( & m) . unwrap ( ) ;
130
+ args. update_from_arg_matches ( & m) . unwrap ( ) ;
128
131
( args, split_args. cargo_args )
129
132
}
130
133
@@ -148,9 +151,10 @@ fn main() -> anyhow::Result<()> {
148
151
}
149
152
ApkSubCmd :: Ndk {
150
153
cargo_cmd,
154
+ args,
151
155
cargo_args,
152
156
} => {
153
- let ( args, cargo_args) = split_apk_and_cargo_args ( cargo_args) ;
157
+ let ( args, cargo_args) = split_apk_and_cargo_args ( args , cargo_args) ;
154
158
155
159
let cmd = Subcommand :: new ( args. subcommand_args ) ?;
156
160
let builder = ApkBuilder :: from_subcommand ( & cmd, args. device ) ?;
@@ -181,7 +185,7 @@ fn test_split_apk_and_cargo_args() {
181
185
let args_default = Args :: parse_from ( std:: iter:: empty :: < & str > ( ) ) ;
182
186
183
187
assert_eq ! (
184
- split_apk_and_cargo_args( vec![ "--quiet" . to_string( ) ] ) ,
188
+ split_apk_and_cargo_args( args_default . clone ( ) , vec![ "--quiet" . to_string( ) ] ) ,
185
189
(
186
190
Args {
187
191
subcommand_args: cargo_subcommand:: Args {
@@ -195,7 +199,10 @@ fn test_split_apk_and_cargo_args() {
195
199
) ;
196
200
197
201
assert_eq ! (
198
- split_apk_and_cargo_args( vec![ "unrecognized" . to_string( ) , "--quiet" . to_string( ) ] ) ,
202
+ split_apk_and_cargo_args(
203
+ args_default. clone( ) ,
204
+ vec![ "unrecognized" . to_string( ) , "--quiet" . to_string( ) ]
205
+ ) ,
199
206
(
200
207
Args {
201
208
subcommand_args: cargo_subcommand:: Args {
@@ -209,7 +216,10 @@ fn test_split_apk_and_cargo_args() {
209
216
) ;
210
217
211
218
assert_eq ! (
212
- split_apk_and_cargo_args( vec![ "--unrecognized" . to_string( ) , "--quiet" . to_string( ) ] ) ,
219
+ split_apk_and_cargo_args(
220
+ args_default. clone( ) ,
221
+ vec![ "--unrecognized" . to_string( ) , "--quiet" . to_string( ) ]
222
+ ) ,
213
223
(
214
224
Args {
215
225
subcommand_args: cargo_subcommand:: Args {
@@ -223,7 +233,10 @@ fn test_split_apk_and_cargo_args() {
223
233
) ;
224
234
225
235
assert_eq ! (
226
- split_apk_and_cargo_args( vec![ "-p" . to_string( ) , "foo" . to_string( ) ] ) ,
236
+ split_apk_and_cargo_args(
237
+ args_default. clone( ) ,
238
+ vec![ "-p" . to_string( ) , "foo" . to_string( ) ]
239
+ ) ,
227
240
(
228
241
Args {
229
242
subcommand_args: cargo_subcommand:: Args {
@@ -237,12 +250,15 @@ fn test_split_apk_and_cargo_args() {
237
250
) ;
238
251
239
252
assert_eq ! (
240
- split_apk_and_cargo_args( vec![
241
- "-p" . to_string( ) ,
242
- "foo" . to_string( ) ,
243
- "--unrecognized" . to_string( ) ,
244
- "--quiet" . to_string( )
245
- ] ) ,
253
+ split_apk_and_cargo_args(
254
+ args_default. clone( ) ,
255
+ vec![
256
+ "-p" . to_string( ) ,
257
+ "foo" . to_string( ) ,
258
+ "--unrecognized" . to_string( ) ,
259
+ "--quiet" . to_string( )
260
+ ]
261
+ ) ,
246
262
(
247
263
Args {
248
264
subcommand_args: cargo_subcommand:: Args {
@@ -257,34 +273,40 @@ fn test_split_apk_and_cargo_args() {
257
273
) ;
258
274
259
275
assert_eq ! (
260
- split_apk_and_cargo_args( vec![
261
- "--no-deps" . to_string( ) ,
262
- "-p" . to_string( ) ,
263
- "foo" . to_string( ) ,
264
- "--unrecognized" . to_string( ) ,
265
- "--quiet" . to_string( )
266
- ] ) ,
276
+ split_apk_and_cargo_args(
277
+ args_default. clone( ) ,
278
+ vec![
279
+ "--no-deps" . to_string( ) ,
280
+ "-p" . to_string( ) ,
281
+ "foo" . to_string( ) ,
282
+ "--unrecognized" . to_string( ) ,
283
+ "--quiet" . to_string( )
284
+ ]
285
+ ) ,
267
286
(
268
287
Args {
269
288
subcommand_args: cargo_subcommand:: Args {
270
289
quiet: true ,
271
290
package: vec![ "foo" . to_string( ) ] ,
272
291
..args_default. subcommand_args. clone( )
273
292
} ,
274
- ..args_default
293
+ ..args_default. clone ( )
275
294
} ,
276
295
vec![ "--no-deps" . to_string( ) , "--unrecognized" . to_string( ) ]
277
296
)
278
297
) ;
279
298
280
299
assert_eq ! (
281
- split_apk_and_cargo_args( vec![
282
- "--no-deps" . to_string( ) ,
283
- "--device" . to_string( ) ,
284
- "adb:test" . to_string( ) ,
285
- "--unrecognized" . to_string( ) ,
286
- "--quiet" . to_string( )
287
- ] ) ,
300
+ split_apk_and_cargo_args(
301
+ args_default. clone( ) ,
302
+ vec![
303
+ "--no-deps" . to_string( ) ,
304
+ "--device" . to_string( ) ,
305
+ "adb:test" . to_string( ) ,
306
+ "--unrecognized" . to_string( ) ,
307
+ "--quiet" . to_string( )
308
+ ]
309
+ ) ,
288
310
(
289
311
Args {
290
312
subcommand_args: cargo_subcommand:: Args {
0 commit comments