public static bool TryParseAsEnum <TEnum>( string value, string optionName, out TEnum result, TEnum?defaultValue = null, OptionValueProvider provider = null) where TEnum : struct { if (!TryParseAsEnum(value, out result, defaultValue, provider)) { WriteParseError(value, optionName, provider?.GetHelpText() ?? OptionValue.GetDefaultHelpText <TEnum>()); return(false); } return(true); }
private static void WriteParseError(string value, string optionName, OptionValueProvider provider) { string helpText = provider.GetHelpText(); WriteParseError(value, optionName, helpText); }
public static bool TryParse( IEnumerable <string> values, string optionName, OptionValueProvider provider, out Filter filter, bool allowNull = false, NamePartKind defaultNamePart = NamePartKind.Name, PatternOptions includedPatternOptions = PatternOptions.None) { filter = null; string pattern = values.FirstOrDefault(); if (pattern == null) { if (allowNull) { return(true); } else { throw new InvalidOperationException($"Option '{OptionNames.GetHelpText(optionName)}' is required."); } } TimeSpan matchTimeout = Regex.InfiniteMatchTimeout; string groupName = null; NamePartKind namePart = defaultNamePart; string separator = null; Func <Capture, bool> predicate = null; List <string> options = null; foreach (string option in values.Skip(1)) { int index = option.IndexOf("="); if (index != -1) { string key = option.Substring(0, index); string value = option.Substring(index + 1); if (OptionValues.Group.IsKeyOrShortKey(key)) { groupName = value; continue; } else if (OptionValues.ListSeparator.IsKeyOrShortKey(key)) { separator = value; continue; } else if (OptionValues.Part.IsKeyOrShortKey(key)) { if (!TryParseAsEnum(value, out namePart, provider: OptionValueProviders.NamePartKindProvider)) { string helpText = OptionValueProviders.NamePartKindProvider.GetHelpText(); WriteError($"Option '{OptionValues.Part.HelpValue}' has invalid value '{value}'. Allowed values: {helpText}."); return(false); } continue; } else if (OptionValues.Timeout.IsKeyOrShortKey(key)) { if (!TryParseMatchTimeout(value, out matchTimeout)) { WriteError($"Option '{OptionValues.Timeout.HelpValue}' has invalid value '{value}'."); return(false); } continue; } } if (Expression.TryParse(option, out Expression expression)) { if (OptionValues.Length.IsKeyOrShortKey(expression.Identifier)) { try { predicate = PredicateHelpers.GetLengthPredicate(expression); continue; } catch (ArgumentException) { WriteError($"Option '{OptionNames.GetHelpText(optionName)}' has invalid value '{option}'."); return(false); } } else { WriteError($"Option '{OptionNames.GetHelpText(optionName)}' has invalid value '{option}'. Allowed values: {provider.GetHelpText()}."); return(false); } } (options ?? (options = new List <string>())).Add(option); } if (!TryParseRegexOptions(options, optionName, out RegexOptions regexOptions, out PatternOptions patternOptions, includedPatternOptions, provider)) { return(false); } switch (patternOptions & (PatternOptions.WholeWord | PatternOptions.WholeLine)) { case PatternOptions.None: case PatternOptions.WholeWord: case PatternOptions.WholeLine: { break; } default: { WriteError($"Values '{OptionValueProviders.PatternOptionsProvider.GetValue(nameof(PatternOptions.WholeWord)).HelpValue}' and '{OptionValueProviders.PatternOptionsProvider.GetValue(nameof(PatternOptions.WholeLine)).HelpValue}' cannot be combined."); return(false); } } if ((patternOptions & PatternOptions.FromFile) != 0 && !FileSystemHelpers.TryReadAllText(pattern, out pattern)) { return(false); } pattern = BuildPattern(pattern, patternOptions, separator); Regex regex = null; try { regex = new Regex(pattern, regexOptions, matchTimeout); } catch (ArgumentException ex) { WriteError(ex, $"Could not parse regular expression: {ex.Message}"); return(false); } int groupIndex = -1; if (groupName != null) { groupIndex = regex.GroupNumberFromName(groupName); if (groupIndex == -1) { string message = $"Group '{groupName}' does not exist."; string[] groupNames = regex.GetGroupNames(); if (groupNames.Length > 1) { message += $" Existing group names: {TextHelpers.Join(", ", " and ", groupNames.Where(f => f != "0"))}."; } WriteError(message); return(false); } } filter = new Filter( regex, namePart: namePart, groupNumber: groupIndex, isNegative: (patternOptions & PatternOptions.Negative) != 0, predicate); return(true); }