@@ -185,6 +185,8 @@ struct Init {
185
185
crate_name : Option < String > ,
186
186
}
187
187
188
+ type InitStep = fn ( & mut Init , & Step , & Logger ) -> result:: Result < ( ) , Error > ;
189
+
188
190
impl Init {
189
191
pub fn new (
190
192
path : Option < String > ,
@@ -203,32 +205,47 @@ impl Init {
203
205
}
204
206
}
205
207
206
- pub fn process ( & mut self , log : & Logger , mode : InitMode ) -> result:: Result < ( ) , Error > {
207
- let process_steps: Vec < fn ( & mut Init , & Step , & Logger ) -> result:: Result < ( ) , Error > > =
208
- match mode {
209
- InitMode :: Normal => vec ! [
210
- Init :: step_check_dependency,
211
- Init :: step_add_wasm_target,
212
- Init :: step_build_wasm,
213
- Init :: step_create_dir,
214
- Init :: step_create_json,
215
- Init :: step_copy_readme,
216
- Init :: step_check_create_type,
217
- Init :: step_install_wasm_bindgen,
218
- Init :: step_running_wasm_bindgen,
219
- ] ,
220
- InitMode :: Nobuild => vec ! [
221
- Init :: step_check_dependency,
222
- Init :: step_create_dir,
223
- Init :: step_create_json,
224
- Init :: step_copy_readme,
225
- ] ,
208
+ fn get_process_steps ( mode : InitMode ) -> Vec < ( & ' static str , InitStep ) > {
209
+ macro_rules! steps {
210
+ ( $( $name: ident) ,+) => {
211
+ {
212
+ let mut steps: Vec <( & ' static str , InitStep ) > = Vec :: new( ) ;
213
+ $( steps. push( ( stringify!( $name) , Init :: $name) ) ; ) *
214
+ steps
215
+ }
226
216
} ;
217
+ ( $( $name: ident, ) * ) => ( steps![ $( $name) ,* ] )
218
+ }
219
+
220
+ match mode {
221
+ InitMode :: Normal => steps ! [
222
+ step_check_dependency,
223
+ step_add_wasm_target,
224
+ step_build_wasm,
225
+ step_create_dir,
226
+ step_create_json,
227
+ step_copy_readme,
228
+ step_check_create_type,
229
+ step_install_wasm_bindgen,
230
+ step_running_wasm_bindgen,
231
+ ] ,
232
+ InitMode :: Nobuild => steps ! [
233
+ step_check_dependency,
234
+ step_create_dir,
235
+ step_create_json,
236
+ step_copy_readme,
237
+ ] ,
238
+ }
239
+ }
240
+
241
+ pub fn process ( & mut self , log : & Logger , mode : InitMode ) -> result:: Result < ( ) , Error > {
242
+ let process_steps = Init :: get_process_steps ( mode) ;
243
+
227
244
let mut step_counter = Step :: new ( process_steps. len ( ) ) ;
228
245
229
246
let started = Instant :: now ( ) ;
230
247
231
- for process_step in process_steps {
248
+ for ( _ , process_step) in process_steps {
232
249
process_step ( self , & step_counter, log) ?;
233
250
step_counter. inc ( ) ;
234
251
}
@@ -453,3 +470,47 @@ fn set_crate_path(path: Option<String>) -> String {
453
470
454
471
crate_path
455
472
}
473
+
474
+ #[ cfg( test) ]
475
+ mod test {
476
+ use super :: * ;
477
+
478
+ #[ test]
479
+ fn init_normal_build ( ) {
480
+ let steps: Vec < & str > = Init :: get_process_steps ( InitMode :: Normal )
481
+ . into_iter ( )
482
+ . map ( |( n, _) | n)
483
+ . collect ( ) ;
484
+ assert_eq ! (
485
+ steps,
486
+ [
487
+ "step_check_dependency" ,
488
+ "step_add_wasm_target" ,
489
+ "step_build_wasm" ,
490
+ "step_create_dir" ,
491
+ "step_create_json" ,
492
+ "step_copy_readme" ,
493
+ "step_check_create_type" ,
494
+ "step_install_wasm_bindgen" ,
495
+ "step_running_wasm_bindgen"
496
+ ]
497
+ ) ;
498
+ }
499
+
500
+ #[ test]
501
+ fn init_skip_build ( ) {
502
+ let steps: Vec < & str > = Init :: get_process_steps ( InitMode :: Nobuild )
503
+ . into_iter ( )
504
+ . map ( |( n, _) | n)
505
+ . collect ( ) ;
506
+ assert_eq ! (
507
+ steps,
508
+ [
509
+ "step_check_dependency" ,
510
+ "step_create_dir" ,
511
+ "step_create_json" ,
512
+ "step_copy_readme"
513
+ ]
514
+ ) ;
515
+ }
516
+ }
0 commit comments