Ejemplo n.º 1
0
 public CommandBuilder WithNamedBool(string name)
 {
     var param = new CommandNamedParameter(name, true, x => x);
     param.ShortNames.Add(name.Substring(0, 1).ToLower());
     param.LongNames.Add(name);
     _lastCommand.NamedParameters.Add(param);
     return this;
 }
Ejemplo n.º 2
0
 public ParserNamedParameterResult(CommandNamedParameter parameter, string value)
 {
     Parameter = parameter;
     Value = value;
 }
Ejemplo n.º 3
0
        private void HandleMissingNamedParameterValue()
        {
            if (!_currentParameter.IsBool)
            {
                throw new CommandLineParserException("No value specified for parameter: " + _currentParameter.PropertyName);
            }

            NamedParameters.Add(new ParserNamedParameterResult(_currentParameter, true.ToString()));
            _currentParameter = null;
        }
Ejemplo n.º 4
0
        public bool Advance()
        {
            if (_currentParameter != null)
            {
                switch (CurrentToken.Kind)
                {
                    case TokenKind.EndOfInput:
                        HandleMissingNamedParameterValue();
                        return false;

                    case TokenKind.LongName:
                    case TokenKind.ShortName:
                        HandleMissingNamedParameterValue();
                        break;

                    case TokenKind.Value:
                        if (_currentParameter.IsBool && !CurrentToken.Text.IsBool())
                        {
                            NamedParameters.Add(new ParserNamedParameterResult(_currentParameter, true.ToString()));
                            _currentParameter = null;
                            return true;
                        }
                        NamedParameters.Add(new ParserNamedParameterResult(_currentParameter, CurrentToken.Text));
                        _currentParameter = null;
                        CurrentToken = _lexer.Pop();
                        return true;
                }
            }

            return HandleDefaultState();
        }
Ejemplo n.º 5
0
        private bool HandleDefaultState()
        {
            switch (CurrentToken.Kind)
            {
                case TokenKind.EndOfInput:
                    return false;

                case TokenKind.LongName:
                    // TODO - check for prefixes?
                    if (_longNames.ContainsKey(CurrentToken.Text))
                    {
                        _currentParameter = _longNames[CurrentToken.Text];
                        CurrentToken = _lexer.Pop();
                        return true;
                    }
                    if (_longHelpFlags.Contains(CurrentToken.Text))
                    {
                        HelpWanted = true;
                        CurrentToken = _lexer.Pop();
                        return true;
                    }
                    throw new CommandLineParserException("Unknown named parameter: " + CurrentToken.Text);

                case TokenKind.ShortName:
                    if (_shortNames.ContainsKey(CurrentToken.Text))
                    {
                        _currentParameter = _shortNames[CurrentToken.Text];
                        CurrentToken = _lexer.Pop();
                        return true;
                    }
                    if (_shortHelpFlags.Contains(CurrentToken.Text))
                    {
                        HelpWanted = true;
                        CurrentToken = _lexer.Pop();
                        return true;
                    }
                    throw new CommandLineParserException("Unknown named parameter: " + CurrentToken.Text);

                case TokenKind.Value:
                    if (_positionalParameters.Any())
                    {
                        var commandParam = _positionalParameters.Peek();
                        if (commandParam.IsList)
                        {
                            // A list; create a new param or add to an existing one
                            if ((PositionalParameters.Count == 0) || (PositionalParameters.Last().Parameter != commandParam))
                            {
                                if (commandParam.IsRequired)
                                {
                                    _pendingRequired.Remove(commandParam.PropertyName);
                                }
                                PositionalParameters.Add(new ParserPositionalParameterResult(commandParam, CurrentToken.Text));
                            }
                            else
                            {
                                PositionalParameters.Last().Values.Add(CurrentToken.Text);
                            }
                        }
                        else
                        {
                            if (commandParam.IsRequired)
                            {
                                _pendingRequired.Remove(commandParam.PropertyName);
                            }
                            // Not a list; always create a new param
                            PositionalParameters.Add(new ParserPositionalParameterResult(commandParam, CurrentToken.Text));
                            _positionalParameters.Dequeue();
                        }

                        CurrentToken = _lexer.Pop();
                        return true;
                    }

                    if (CurrentNode is Command)
                    {
                        throw new CommandLineParserException("Unexpected positional parameter: " + CurrentToken.Text);
                    }

                    if (CurrentNode is CommandGroup)
                    {
                        // TODO - handle substring matching ("comm" should match "commit", if unique)
                        var next = ((CommandGroup)CurrentNode).Nodes.FirstOrDefault(x => x.Verb.Equals(CurrentToken.Text, StringComparison.InvariantCultureIgnoreCase));
                        if (next == null)
                        {
                            if (CurrentToken.Text == _helpVerb)
                            {
                                HelpWanted = true;
                                CurrentToken = _lexer.Pop();
                                return true;
                            }
                        }
                        if (next == null)
                        {
                            // TODO - build up a pretty message
                            throw new CommandLineParserException("Unknown command!");
                        }

                        // Advance
                        CurrentNode = next;
                        ExtractParameters(CurrentNode);
                        CurrentToken = _lexer.Pop();
                        return true;
                    }

                    // Should never hit this
                    throw new CommandLineParserException("Invalid parser state!");
            }

            return false;
        }