@@ -121,8 +121,8 @@ template CLI(Config config, COMMAND)
121
121
return res;
122
122
}
123
123
124
- static int parseArgs (alias newMain)(string [] args, COMMAND initialValue = COMMAND .init)
125
- if (__traits(compiles, { newMain(COMMAND .init ); }))
124
+ static int parseArgs (alias newMain)(string [] args, auto ref COMMAND initialValue = COMMAND .init)
125
+ if (__traits(compiles, { newMain(initialValue ); }))
126
126
{
127
127
alias value = initialValue;
128
128
@@ -139,8 +139,8 @@ template CLI(Config config, COMMAND)
139
139
}
140
140
}
141
141
142
- static int parseArgs (alias newMain)(string [] args, COMMAND initialValue = COMMAND .init)
143
- if (__traits(compiles, { newMain(COMMAND .init , string [].init); }))
142
+ static int parseArgs (alias newMain)(string [] args, auto ref COMMAND initialValue = COMMAND .init)
143
+ if (__traits(compiles, { newMain(initialValue , string [].init); }))
144
144
{
145
145
alias value = initialValue;
146
146
@@ -205,11 +205,55 @@ alias CLI(COMMANDS...) = CLI!(Config.init, COMMANDS);
205
205
206
206
unittest
207
207
{
208
- struct Args {}
208
+ static struct Args {}
209
209
210
- mixin CLI ! ({
211
- Config cfg;
212
- cfg.errorHandler = (string s) {};
213
- return cfg;
214
- }(), Args).main! ((_){});
210
+ Args initValue;
211
+
212
+ enum Config cfg = { errorHandler: (string s) {} };
213
+
214
+ assert (CLI ! (cfg, Args).parseArgs! ((_ ){})([]) == 0 );
215
+ assert (CLI ! (cfg, Args).parseArgs! ((_, string [] unknown){})([]) == 0 );
216
+ assert (CLI ! (cfg, Args).parseArgs! ((_ ){ return 123 ; })([]) == 123 );
217
+ assert (CLI ! (cfg, Args).parseArgs! ((_, string [] unknown){ return 123 ; })([]) == 123 );
218
+
219
+ assert (CLI ! (cfg, Args).parseArgs! ((_ ){})([], initValue) == 0 );
220
+ assert (CLI ! (cfg, Args).parseArgs! ((_, string [] unknown){})([], initValue) == 0 );
221
+ assert (CLI ! (cfg, Args).parseArgs! ((_ ){ return 123 ; })([], initValue) == 123 );
222
+ assert (CLI ! (cfg, Args).parseArgs! ((_, string [] unknown){ return 123 ; })([], initValue) == 123 );
223
+
224
+ // Ensure that CLI.main is compilable
225
+ { mixin CLI ! (cfg, Args).main! ((_ ){}); }
226
+ { mixin CLI ! (cfg, Args).main! ((_, string [] unknown){}); }
227
+ { mixin CLI ! (cfg, Args).main! ((_ ){ return 123 ; }); }
228
+ { mixin CLI ! (cfg, Args).main! ((_, string [] unknown){ return 123 ; }); }
229
+ }
230
+
231
+ // Ensure that CLI works with non-copyable structs
232
+ unittest
233
+ {
234
+ static struct Args {
235
+ @disable this (ref Args);
236
+ this (int ) {}
237
+ }
238
+
239
+ // Args initValue;
240
+ auto initValue = Args(0 );
241
+
242
+ enum Config cfg = { errorHandler: (string s) {} };
243
+
244
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _ ){})([]) == 0 );
245
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _, string [] unknown){})([]) == 0 );
246
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _ ){ return 123 ; })([]) == 123 );
247
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _, string [] unknown){ return 123 ; })([]) == 123 );
248
+
249
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _ ){})([], initValue) == 0 );
250
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _, string [] unknown){})([], initValue) == 0 );
251
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _ ){ return 123 ; })([], initValue) == 123 );
252
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _, string [] unknown){ return 123 ; })([], initValue) == 123 );
253
+
254
+ // Ensure that CLI.main is compilable
255
+ { mixin CLI ! (cfg, Args).main! ((ref _ ){}); }
256
+ { mixin CLI ! (cfg, Args).main! ((ref _, string [] unknown){}); }
257
+ { mixin CLI ! (cfg, Args).main! ((ref _ ){ return 123 ; }); }
258
+ { mixin CLI ! (cfg, Args).main! ((ref _, string [] unknown){ return 123 ; }); }
215
259
}
0 commit comments