4using System.Collections.Generic;
16 Func<string, NameLookupResult> nameLookup)
18 return Tokenize(arguments, nameLookup,
false,
true,
false);
22 Func<string, NameLookupResult> nameLookup,
23 bool ignoreUnknownArguments,
27 List<Error> errors =
new List<Error>();
30 Action<string> doNothing = name => { };
31 Action<string> onUnknownOption = ignoreUnknownArguments ? doNothing : unknownOptionError;
34 Action<int> onConsumeNext = n => consumeNext = consumeNext + n;
35 bool forceValues =
false;
37 List<Token> tokens =
new List<Token>();
39 IEnumerator<string> enumerator = arguments.GetEnumerator();
41 while (enumerator.MoveNext())
43 switch (enumerator.Current)
48 case string arg when forceValues:
53 case string arg when consumeNext > 0:
55 consumeNext = consumeNext - 1;
59 case "--" when allowDashDash:
85 case string arg when arg.StartsWith(
"--"):
96 case string arg when arg.StartsWith(
"-"):
97 tokens.AddRange(
TokenizeShortName(arg, nameLookup, onUnknownOption, onConsumeNext));
114 return Result.Succeed(tokens.AsEnumerable(), errors.AsEnumerable());
119 Func<
string,
Maybe<char>> optionSequenceWithSeparatorLookup)
121 IEnumerable<Token> tokens = tokenizerResult.SucceededWith()
124 List<Token> exploded =
new List<Token>(tokens is ICollection<Token> coll ? coll.Count : tokens.Count());
128 foreach (
Token token
in tokens)
132 separator = optionSequenceWithSeparatorLookup(token.
Text);
138 if (separator.MatchJust(out
char sep) && sep !=
'\0' && !token.IsValueForced())
140 if (token.
Text.Contains(sep))
142 exploded.AddRange(token.
Text.Split(sep)
160 return Result.Succeed(exploded as IEnumerable<Token>, tokenizerResult.SuccessMessages());
165 IEnumerable<OptionSpecification>,
168 bool ignoreUnknownArguments,
172 return (arguments, optionSpecs) =>
179 ignoreUnknownArguments,
187 return explodedTokens;
192 Func<string, NameLookupResult> nameLookup,
193 Action<string> onUnknownOption,
194 Action<int> onConsumeNext)
198 string chars = arg.Substring(1);
199 int len = chars.Length;
201 if (len > 0 &&
char.IsDigit(chars[0]))
209 for (
int i = 0; i < len; i++)
211 string s =
new string(chars[i], 1);
213 switch (nameLookup(s))
221 yield
return Token.
Value(chars.Substring(i + 1));
245 Func<string, NameLookupResult> nameLookup,
246 Action<string> onBadFormatToken,
247 Action<string> onUnknownOption,
248 Action<int> onConsumeNext)
250 string[] parts = arg.Substring(2)
251 .Split(
new[] {
'=' },
254 string name = parts[0];
255 string value = parts.Length > 1 ? parts[1] :
null;
258 if (
string.IsNullOrWhiteSpace(name) || name.Contains(
" "))
260 onBadFormatToken(arg);
265 switch (nameLookup(name))
268 onUnknownOption(name);
The Maybe type models an optional value. A value of type Maybe a either contains a value of type a (r...
static Result< IEnumerable< Token >, Error > Tokenize(IEnumerable< string > arguments, Func< string, NameLookupResult > nameLookup)
static Result< IEnumerable< Token >, Error > Tokenize(IEnumerable< string > arguments, Func< string, NameLookupResult > nameLookup, bool ignoreUnknownArguments, bool allowDashDash, bool posixlyCorrect)
static IEnumerable< Token > TokenizeLongName(string arg, Func< string, NameLookupResult > nameLookup, Action< string > onBadFormatToken, Action< string > onUnknownOption, Action< int > onConsumeNext)
static Func< IEnumerable< string >, IEnumerable< OptionSpecification >, Result< IEnumerable< Token >, Error > > ConfigureTokenizer(StringComparer nameComparer, bool ignoreUnknownArguments, bool enableDashDash, bool posixlyCorrect)
static IEnumerable< Token > TokenizeShortName(string arg, Func< string, NameLookupResult > nameLookup, Action< string > onUnknownOption, Action< int > onConsumeNext)
static Result< IEnumerable< Token >, Error > ExplodeOptionList(Result< IEnumerable< Token >, Error > tokenizerResult, Func< string, Maybe< char > > optionSequenceWithSeparatorLookup)
static NameLookupResult Contains(string name, IEnumerable< OptionSpecification > specifications, StringComparer comparer)
static Maybe< char > HavingSeparator(string name, IEnumerable< OptionSpecification > specifications, StringComparer comparer)
static Token Value(string text)
static Token Name(string text)
static Token ValueForced(string text)
static Token ValueFromSeparator(string text)
Models an error generated when an unknown option is detected.
Represents the result of a computation.