@@ -16,15 +16,22 @@ public static Result<IEnumerable<Token>, Error> Tokenize(
1616 IEnumerable < string > arguments ,
1717 Func < string , NameLookupResult > nameLookup )
1818 {
19- return GetoptTokenizer . Tokenize ( arguments , nameLookup , ignoreUnknownArguments : false , allowDashDash : true , posixlyCorrect : false ) ;
19+ return GetoptTokenizer . Tokenize (
20+ arguments ,
21+ nameLookup ,
22+ ignoreUnknownArguments : false ,
23+ allowDashDash : true ,
24+ posixlyCorrect : false ,
25+ optionsParseMode : OptionsParseMode . Default ) ;
2026 }
2127
2228 public static Result < IEnumerable < Token > , Error > Tokenize (
2329 IEnumerable < string > arguments ,
2430 Func < string , NameLookupResult > nameLookup ,
2531 bool ignoreUnknownArguments ,
2632 bool allowDashDash ,
27- bool posixlyCorrect )
33+ bool posixlyCorrect ,
34+ OptionsParseMode optionsParseMode )
2835 {
2936 var errors = new List < Error > ( ) ;
3037 Action < string > onBadFormatToken = arg => errors . Add ( new BadFormatTokenError ( arg ) ) ;
@@ -70,11 +77,31 @@ public static Result<IEnumerable<Token>, Error> Tokenize(
7077 break ;
7178
7279 case string arg when arg . StartsWith ( "--" ) :
80+
81+ if ( optionsParseMode == OptionsParseMode . SingleDashOnly )
82+ {
83+ onBadFormatToken ( arg ) ;
84+ continue ;
85+ }
86+
7387 tokens . AddRange ( TokenizeLongName ( arg , nameLookup , onBadFormatToken , onUnknownOption , onConsumeNext ) ) ;
7488 break ;
7589
7690 case string arg when arg . StartsWith ( "-" ) :
77- tokens . AddRange ( TokenizeShortName ( arg , nameLookup , onUnknownOption , onConsumeNext ) ) ;
91+ switch ( optionsParseMode )
92+ {
93+ case OptionsParseMode . Default :
94+ tokens . AddRange ( TokenizeShortName ( arg , nameLookup , onUnknownOption , onConsumeNext ) ) ;
95+ break ;
96+
97+ case OptionsParseMode . SingleOrDoubleDash :
98+ case OptionsParseMode . SingleDashOnly :
99+ tokens . AddRange ( TokenizeLongName ( arg , nameLookup , onBadFormatToken , onUnknownOption , onConsumeNext , dashCount : 1 ) ) ;
100+ break ;
101+
102+ default :
103+ throw new ArgumentOutOfRangeException ( nameof ( optionsParseMode ) , optionsParseMode , null ) ;
104+ }
78105 break ;
79106
80107 case string arg :
@@ -126,12 +153,23 @@ public static Func<
126153 StringComparer nameComparer ,
127154 bool ignoreUnknownArguments ,
128155 bool enableDashDash ,
129- bool posixlyCorrect )
156+ bool posixlyCorrect ,
157+ OptionsParseMode optionsParseMode )
130158 {
131159 return ( arguments , optionSpecs ) =>
132160 {
133- var tokens = GetoptTokenizer . Tokenize ( arguments , name => NameLookup . Contains ( name , optionSpecs , nameComparer ) , ignoreUnknownArguments , enableDashDash , posixlyCorrect ) ;
134- var explodedTokens = GetoptTokenizer . ExplodeOptionList ( tokens , name => NameLookup . HavingSeparator ( name , optionSpecs , nameComparer ) ) ;
161+ var tokens = GetoptTokenizer . Tokenize (
162+ arguments ,
163+ name => NameLookup . Contains ( name , optionSpecs , nameComparer ) ,
164+ ignoreUnknownArguments ,
165+ enableDashDash ,
166+ posixlyCorrect ,
167+ optionsParseMode ) ;
168+
169+ var explodedTokens = GetoptTokenizer . ExplodeOptionList (
170+ tokens ,
171+ name => NameLookup . HavingSeparator ( name , optionSpecs , nameComparer ) ) ;
172+
135173 return explodedTokens ;
136174 } ;
137175 }
@@ -190,9 +228,10 @@ private static IEnumerable<Token> TokenizeLongName(
190228 Func < string , NameLookupResult > nameLookup ,
191229 Action < string > onBadFormatToken ,
192230 Action < string > onUnknownOption ,
193- Action < int > onConsumeNext )
231+ Action < int > onConsumeNext ,
232+ int dashCount = 2 )
194233 {
195- string [ ] parts = arg . Substring ( 2 ) . Split ( new char [ ] { '=' } , 2 ) ;
234+ string [ ] parts = arg . Substring ( dashCount ) . Split ( new char [ ] { '=' } , 2 ) ;
196235 string name = parts [ 0 ] ;
197236 string value = ( parts . Length > 1 ) ? parts [ 1 ] : null ;
198237 // A parameter like "--stringvalue=" is acceptable, and makes stringvalue be the empty string
0 commit comments