Example #1
0
        private IParsingResultsDictionary parseConfigFromCommandLine()
        {
            var arguments          = new Queue <string>(_source.Args);
            var plainValueCounter  = 0;
            var resultsBuilder     = new ParsingResultsBuilder(_source.DuplicateKeyBehavior);
            var lastArgumentString = _source.Args.First();

            while (arguments.Any())
            {
                var currentArgumentString = arguments.Dequeue();
                var parsedArgument        = ArgumentType.CreateFrom(currentArgumentString);
                switch (parsedArgument)
                {
                case ArgumentType.SingleDash dashArgument:
                    handleSingleDashArgument(resultsBuilder, arguments, dashArgument);
                    break;

                case ArgumentType.DoubleDash doubleDashArgument:
                    handleDoubledashArgument(resultsBuilder, arguments, doubleDashArgument);
                    break;

                case ArgumentType.Assignment assignment:
                    if (_source.AllowDirectAssignments)
                    {
                        resultsBuilder.Add(assignment.Key, assignment.Value);
                    }
                    else
                    {
                        resultsBuilder.Error(new NotSupportedException($"Invalid argument '{assignment.Argument}' as direct assignments are not allowed."));
                    }
                    break;

                case ArgumentType.Invalid invalid:
                    resultsBuilder.Error(new ParsingException("Invalid argument.", $"Argument somewhere near: '{lastArgumentString.Limit(16)}'"));
                    break;

                case ArgumentType.Plain plain:
                    if (plainValueCounter < _valueDefinitions.Count)
                    {
                        resultsBuilder.Add(_valueDefinitions[plainValueCounter], plain.Argument);
                    }
                    else
                    {
                        resultsBuilder.Error(new IndexOutOfRangeException($"No more than {_valueDefinitions.Count} value arguments are allowed."));
                    }

                    plainValueCounter++;
                    break;
                }

                lastArgumentString = currentArgumentString;
            }

            if (_valueDefinitions.Count > plainValueCounter)
            {
                resultsBuilder.Error(new ValueRequiredException(string.Empty, $"Not all required values have been provided. Expected: {_valueDefinitions.Count}, Provided: {plainValueCounter}"));
            }

            return(resultsBuilder.GetResults());
        }
        private static IParsingResultsDictionary readIniFromStream(Stream stream, KeyNameBehavior duplicateKeyBehavior)
        {
            var resultBuilder = new ParsingResultsBuilder(duplicateKeyBehavior);

            using (StreamReader streamReader = new StreamReader(stream))
            {
                var currentKeyPrefix = string.Empty;
                int lineCounter      = 0;
                while (streamReader.Peek() != -1)
                {
                    string currentLine = streamReader.ReadLine();
                    lineCounter++;

                    if (iniLineIsNotEmptyOrComment(currentLine))
                    {
                        var currentLineIsSectionHeading = getHeadingFromIniLine(currentLine);
                        currentKeyPrefix = currentLineIsSectionHeading.GetValue(currentKeyPrefix);

                        if (currentLineIsSectionHeading.IsNothing())
                        {
                            int assignmentOperatorPos = currentLine.IndexOf('=');
                            if (assignmentOperatorPos == 0)
                            {
                                resultBuilder.ErrorInvalidParsing($"Line #{lineCounter}", $"Line cannot start with assignment operator.{Environment.NewLine}  {currentLine}");
                            }
                            else if (assignmentOperatorPos < 0)
                            {
                                resultBuilder.Add(currentKeyPrefix + currentLine.Trim(), string.Empty, () => $"Error in line #{lineCounter}:");
                            }
                            else
                            {
                                string keyFullPathName = $"{currentKeyPrefix}{currentLine.Substring(0, assignmentOperatorPos).Trim()}";
                                string currentValue    = assignmentOperatorPos < currentLine.Trim().Length - 1
                                    ? getValueFromPossiblyQuotedString(currentLine.Substring(assignmentOperatorPos + 1).Trim())
                                    : string.Empty;

                                resultBuilder.Add(keyFullPathName, currentValue, () => $"Error in line #{lineCounter}:");
                            }
                        }
                    }
                }

                return(resultBuilder.GetResults());
            }
        }