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; }
public ParserNamedParameterResult(CommandNamedParameter parameter, string value) { Parameter = parameter; Value = value; }
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; }
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(); }
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; }