@@ -23,6 +23,15 @@ public static ParserResult<object> Choose(
23
23
bool autoVersion ,
24
24
IEnumerable < ErrorType > nonFatalErrors )
25
25
{
26
+ var verbs = Verb . SelectFromTypes ( types ) ;
27
+ var defaultVerbs = verbs . Where ( t => t . Item1 . IsDefault ) ;
28
+
29
+ int defaultVerbCount = defaultVerbs . Count ( ) ;
30
+ if ( defaultVerbCount > 1 )
31
+ return MakeNotParsed ( types , new MultipleDefaultVerbsError ( ) ) ;
32
+
33
+ var defaultVerb = defaultVerbCount == 1 ? defaultVerbs . First ( ) : null ;
34
+
26
35
Func < ParserResult < object > > choose = ( ) =>
27
36
{
28
37
var firstArg = arguments . First ( ) ;
@@ -31,25 +40,52 @@ public static ParserResult<object> Choose(
31
40
nameComparer . Equals ( command , firstArg ) ||
32
41
nameComparer . Equals ( string . Concat ( "--" , command ) , firstArg ) ;
33
42
34
- var verbs = Verb . SelectFromTypes ( types ) ;
35
-
36
43
return ( autoHelp && preprocCompare ( "help" ) )
37
44
? MakeNotParsed ( types ,
38
45
MakeHelpVerbRequestedError ( verbs ,
39
46
arguments . Skip ( 1 ) . FirstOrDefault ( ) ?? string . Empty , nameComparer ) )
40
47
: ( autoVersion && preprocCompare ( "version" ) )
41
48
? MakeNotParsed ( types , new VersionRequestedError ( ) )
42
- : MatchVerb ( tokenizer , verbs , arguments , nameComparer , ignoreValueCase , parsingCulture , autoHelp , autoVersion , nonFatalErrors ) ;
49
+ : MatchVerb ( tokenizer , verbs , defaultVerb , arguments , nameComparer , ignoreValueCase , parsingCulture , autoHelp , autoVersion , nonFatalErrors ) ;
43
50
} ;
44
51
45
52
return arguments . Any ( )
46
53
? choose ( )
47
- : MakeNotParsed ( types , new NoVerbSelectedError ( ) ) ;
54
+ : ( defaultVerbCount == 1
55
+ ? MatchDefaultVerb ( tokenizer , verbs , defaultVerb , arguments , nameComparer , ignoreValueCase , parsingCulture , autoHelp , autoVersion , nonFatalErrors )
56
+ : MakeNotParsed ( types , new NoVerbSelectedError ( ) ) ) ;
57
+ }
58
+
59
+ private static ParserResult < object > MatchDefaultVerb (
60
+ Func < IEnumerable < string > , IEnumerable < OptionSpecification > , Result < IEnumerable < Token > , Error > > tokenizer ,
61
+ IEnumerable < Tuple < Verb , Type > > verbs ,
62
+ Tuple < Verb , Type > defaultVerb ,
63
+ IEnumerable < string > arguments ,
64
+ StringComparer nameComparer ,
65
+ bool ignoreValueCase ,
66
+ CultureInfo parsingCulture ,
67
+ bool autoHelp ,
68
+ bool autoVersion ,
69
+ IEnumerable < ErrorType > nonFatalErrors )
70
+ {
71
+ return ! ( defaultVerb is null )
72
+ ? InstanceBuilder . Build (
73
+ Maybe . Just < Func < object > > ( ( ) => defaultVerb . Item2 . AutoDefault ( ) ) ,
74
+ tokenizer ,
75
+ arguments ,
76
+ nameComparer ,
77
+ ignoreValueCase ,
78
+ parsingCulture ,
79
+ autoHelp ,
80
+ autoVersion ,
81
+ nonFatalErrors )
82
+ : MakeNotParsed ( verbs . Select ( v => v . Item2 ) , new BadVerbSelectedError ( arguments . First ( ) ) ) ;
48
83
}
49
84
50
85
private static ParserResult < object > MatchVerb (
51
86
Func < IEnumerable < string > , IEnumerable < OptionSpecification > , Result < IEnumerable < Token > , Error > > tokenizer ,
52
87
IEnumerable < Tuple < Verb , Type > > verbs ,
88
+ Tuple < Verb , Type > defaultVerb ,
53
89
IEnumerable < string > arguments ,
54
90
StringComparer nameComparer ,
55
91
bool ignoreValueCase ,
@@ -71,7 +107,7 @@ private static ParserResult<object> MatchVerb(
71
107
autoHelp ,
72
108
autoVersion ,
73
109
nonFatalErrors )
74
- : MakeNotParsed ( verbs . Select ( v => v . Item2 ) , new BadVerbSelectedError ( arguments . First ( ) ) ) ;
110
+ : MatchDefaultVerb ( tokenizer , verbs , defaultVerb , arguments , nameComparer , ignoreValueCase , parsingCulture , autoHelp , autoVersion , nonFatalErrors ) ;
75
111
}
76
112
77
113
private static HelpVerbRequestedError MakeHelpVerbRequestedError (
0 commit comments