@@ -62,8 +62,8 @@ template CLI(Config config, COMMAND)
62
62
return res;
63
63
}
64
64
65
- static int parseArgs (alias newMain)(string [] args, COMMAND initialValue = COMMAND .init)
66
- if (__traits(compiles, { newMain(COMMAND .init ); }))
65
+ static int parseArgs (alias newMain)(string [] args, auto ref COMMAND initialValue = COMMAND .init)
66
+ if (__traits(compiles, { newMain(initialValue ); }))
67
67
{
68
68
alias value = initialValue;
69
69
@@ -80,8 +80,8 @@ template CLI(Config config, COMMAND)
80
80
}
81
81
}
82
82
83
- static int parseArgs (alias newMain)(string [] args, COMMAND initialValue = COMMAND .init)
84
- if (__traits(compiles, { newMain(COMMAND .init , string [].init); }))
83
+ static int parseArgs (alias newMain)(string [] args, auto ref COMMAND initialValue = COMMAND .init)
84
+ if (__traits(compiles, { newMain(initialValue , string [].init); }))
85
85
{
86
86
alias value = initialValue;
87
87
@@ -153,4 +153,61 @@ template CLI(Config config, COMMAND)
153
153
}
154
154
}
155
155
156
- alias CLI (COMMANDS ... ) = CLI ! (Config.init, COMMANDS );
156
+ alias CLI (COMMANDS ... ) = CLI ! (Config.init, COMMANDS );
157
+
158
+ // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
159
+
160
+ unittest
161
+ {
162
+ static struct Args {}
163
+
164
+ Args initValue;
165
+
166
+ enum cfg = Config.init;
167
+
168
+ assert (CLI ! (cfg, Args).parseArgs! ((_ ){})([]) == 0 );
169
+ assert (CLI ! (cfg, Args).parseArgs! ((_, string [] unknown){})([]) == 0 );
170
+ assert (CLI ! (cfg, Args).parseArgs! ((_ ){ return 123 ; })([]) == 123 );
171
+ assert (CLI ! (cfg, Args).parseArgs! ((_, string [] unknown){ return 123 ; })([]) == 123 );
172
+
173
+ assert (CLI ! (cfg, Args).parseArgs! ((_ ){})([], initValue) == 0 );
174
+ assert (CLI ! (cfg, Args).parseArgs! ((_, string [] unknown){})([], initValue) == 0 );
175
+ assert (CLI ! (cfg, Args).parseArgs! ((_ ){ return 123 ; })([], initValue) == 123 );
176
+ assert (CLI ! (cfg, Args).parseArgs! ((_, string [] unknown){ return 123 ; })([], initValue) == 123 );
177
+
178
+ // Ensure that CLI.main is compilable
179
+ { mixin CLI ! (cfg, Args).main! ((_ ){}); }
180
+ { mixin CLI ! (cfg, Args).main! ((_, string [] unknown){}); }
181
+ { mixin CLI ! (cfg, Args).main! ((_ ){ return 123 ; }); }
182
+ { mixin CLI ! (cfg, Args).main! ((_, string [] unknown){ return 123 ; }); }
183
+ }
184
+
185
+ // Ensure that CLI works with non-copyable structs
186
+ unittest
187
+ {
188
+ static struct Args {
189
+ @disable this (ref Args);
190
+ this (int ) {}
191
+ }
192
+
193
+ // Args initValue;
194
+ auto initValue = Args(0 );
195
+
196
+ enum cfg = Config.init;
197
+
198
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _ ){})([]) == 0 );
199
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _, string [] unknown){})([]) == 0 );
200
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _ ){ return 123 ; })([]) == 123 );
201
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _, string [] unknown){ return 123 ; })([]) == 123 );
202
+
203
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _ ){})([], initValue) == 0 );
204
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _, string [] unknown){})([], initValue) == 0 );
205
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _ ){ return 123 ; })([], initValue) == 123 );
206
+ assert (CLI ! (cfg, Args).parseArgs! ((ref _, string [] unknown){ return 123 ; })([], initValue) == 123 );
207
+
208
+ // Ensure that CLI.main is compilable
209
+ { mixin CLI ! (cfg, Args).main! ((ref _ ){}); }
210
+ { mixin CLI ! (cfg, Args).main! ((ref _, string [] unknown){}); }
211
+ { mixin CLI ! (cfg, Args).main! ((ref _ ){ return 123 ; }); }
212
+ { mixin CLI ! (cfg, Args).main! ((ref _, string [] unknown){ return 123 ; }); }
213
+ }
0 commit comments