4using System.Collections.Generic;
6using System.Text.RegularExpressions;
19 Func<string, NameLookupResult> nameLookup)
21 return Tokenize(arguments, nameLookup, tokens => tokens);
25 Func<string, NameLookupResult> nameLookup,
26 Func<IEnumerable<Token>, IEnumerable<Token>> normalize)
28 List<Error> errors =
new List<Error>();
29 Action<Error> onError = errors.Add;
31 IEnumerable<Token> tokens = (from arg in arguments
32 from token in !arg.StartsWith(
"-", StringComparison.Ordinal) ?
new[]
36 arg.StartsWith(
"--", StringComparison.Ordinal) ?
42 IEnumerable<Token> normalized = normalize(tokens)
45 IEnumerable<Token> unkTokens =
46 (from t in normalized where t.IsName() && nameLookup(t.Text) == NameLookupResult.NoOptionFound select t)
49 return Result.Succeed(normalized.Where(x => !unkTokens.Contains(x)),
55 Func<IEnumerable<string>,
59 if (arguments.Any(arg => arg.EqualsOrdinal(
"--")))
62 tokenizer(arguments.TakeWhile(arg => !arg.EqualsOrdinal(
"--")));
64 IEnumerable<Token> values = arguments.SkipWhile(arg => !arg.EqualsOrdinal(
"--"))
68 return tokenizerResult.Map(tokens => tokens.Concat(values));
71 return tokenizer(arguments);
76 Func<
string,
Maybe<char>> optionSequenceWithSeparatorLookup)
78 IEnumerable<Token> tokens = tokenizerResult.SucceededWith()
81 List<Token> exploded =
new List<Token>(tokens is ICollection<Token> coll ? coll.Count : tokens.Count());
85 foreach (
Token token
in tokens)
89 separator = optionSequenceWithSeparatorLookup(token.
Text);
95 if (separator.MatchJust(out
char sep) && sep !=
'\0' && !token.IsValueForced())
97 if (token.
Text.Contains(sep))
99 exploded.AddRange(token.
Text.Split(sep)
117 return Result.Succeed(exploded as IEnumerable<Token>, tokenizerResult.SuccessMessages());
127 public static IEnumerable<Token>
Normalize(IEnumerable<Token> tokens,
128 Func<string, bool> nameLookup)
130 IEnumerable<Tuple<Token, Token>> toExclude =
132 tokens.Select((t, i) =>
134 if (t.IsName() ==
false || nameLookup(t.Text))
136 return Maybe.Nothing<Tuple<Token, Token>>();
142 bool removeValue = next.MatchJust(out
Token nextValue) &&
143 next.MapValueOrDefault(p => p.IsValue() &&
144 ((
Value)p).ExplicitlyAssigned,
148 return Maybe.Just(
new Tuple<Token, Token>(t, removeValue ? nextValue :
null));
151 .Where(i => i.IsJust())
152 select i.FromJustOrFail();
154 IEnumerable<Token> normalized =
155 tokens.Where(t => toExclude.Any(e => ReferenceEquals(e.Item1, t) || ReferenceEquals(e.Item2, t)) ==
164 IEnumerable<OptionSpecification>,
167 bool ignoreUnknownArguments,
170 return (arguments, optionSpecs) =>
172 Func<IEnumerable<Token>, IEnumerable<Token>> normalize = ignoreUnknownArguments
181 :
new Func<IEnumerable<Token>,
182 IEnumerable<Token>>(toks => toks);
206 return explodedTokens;
211 Func<string, NameLookupResult> nameLookup)
214 if (value.Length == 1 && value[0] ==
'-')
221 if (value.Length > 1 && value[0] ==
'-' && value[1] !=
'-')
223 string text = value.Substring(1);
225 if (
char.IsDigit(text[0]))
232 if (value.Length == 2)
241 foreach (
char c
in text)
243 string n =
new string(c, 1);
271 Action<Error> onError)
273 if (value.Length > 2 && value.StartsWith(
"--", StringComparison.Ordinal))
275 string text = value.Substring(2);
276 int equalIndex = text.IndexOf(
'=');
292 Match tokenMatch = Regex.Match(text,
"^([^=]+)=([^ ].*)$");
294 if (tokenMatch.Success)
296 yield
return Token.
Name(tokenMatch.Groups[1].Value);
297 yield
return Token.
Value(tokenMatch.Groups[2].Value,
true);
The Maybe type models an optional value. A value of type Maybe a either contains a value of type a (r...
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)
static IEnumerable< Token > TokenizeShortName(string value, Func< string, NameLookupResult > nameLookup)
static Result< IEnumerable< Token >, Error > ExplodeOptionList(Result< IEnumerable< Token >, Error > tokenizerResult, Func< string, Maybe< char > > optionSequenceWithSeparatorLookup)
static Func< IEnumerable< string >, IEnumerable< OptionSpecification >, Result< IEnumerable< Token >, Error > > ConfigureTokenizer(StringComparer nameComparer, bool ignoreUnknownArguments, bool enableDashDash)
static Result< IEnumerable< Token >, Error > Tokenize(IEnumerable< string > arguments, Func< string, NameLookupResult > nameLookup)
static IEnumerable< Token > TokenizeLongName(string value, Action< Error > onError)
static Result< IEnumerable< Token >, Error > Tokenize(IEnumerable< string > arguments, Func< string, NameLookupResult > nameLookup, Func< IEnumerable< Token >, IEnumerable< Token > > normalize)
static IEnumerable< Token > Normalize(IEnumerable< Token > tokens, Func< string, bool > nameLookup)
Normalizes the given tokens .
static Result< IEnumerable< Token >, Error > PreprocessDashDash(IEnumerable< string > arguments, Func< IEnumerable< string >, Result< IEnumerable< Token >, Error > > tokenizer)
Models an error generated when an unknown option is detected.
Represents the result of a computation.