| @@ -4,7 +4,7 @@ namespace Discord.Commands | |||
| { | |||
| internal static class CommandParser | |||
| { | |||
| private enum CommandParserPart | |||
| private enum ParserPart | |||
| { | |||
| None, | |||
| Parameter, | |||
| @@ -32,7 +32,7 @@ namespace Discord.Commands | |||
| else if (currentChar == '\\') | |||
| isEscaped = true; | |||
| if ((!isEscaped && currentChar == ' ') || endPosition >= inputLength) | |||
| if ((!isEscaped && IsWhiteSpace(currentChar)) || endPosition >= inputLength) | |||
| { | |||
| int length = (currentChar == ' ' ? endPosition - 1 : endPosition) - startPosition; | |||
| string temp = input.Substring(startPosition, length); | |||
| @@ -55,11 +55,12 @@ namespace Discord.Commands | |||
| commands = map.GetCommands(); //Work our way backwards to find a command that matches our input | |||
| return commands != null; | |||
| } | |||
| private static bool IsWhiteSpace(char c) => c == ' ' || c == '\n' || c == '\r' || c == '\t'; | |||
| //TODO: Check support for escaping | |||
| public static CommandErrorType? ParseArgs(string input, int startPos, Command command, out string[] args) | |||
| { | |||
| CommandParserPart currentPart = CommandParserPart.None; | |||
| ParserPart currentPart = ParserPart.None; | |||
| int startPosition = startPos; | |||
| int endPosition = startPos; | |||
| int inputLength = input.Length; | |||
| @@ -94,20 +95,26 @@ namespace Discord.Commands | |||
| else if (currentChar == '\\') | |||
| isEscaped = true; | |||
| if (endPosition == startPosition + 1 && IsWhiteSpace(currentChar)) //Has no text yet, and is another whitespace | |||
| { | |||
| startPosition = endPosition; | |||
| continue; | |||
| } | |||
| switch (currentPart) | |||
| { | |||
| case CommandParserPart.None: | |||
| case ParserPart.None: | |||
| if ((!isEscaped && currentChar == '\"')) | |||
| { | |||
| currentPart = CommandParserPart.DoubleQuotedParameter; | |||
| currentPart = ParserPart.DoubleQuotedParameter; | |||
| startPosition = endPosition; | |||
| } | |||
| else if ((!isEscaped && currentChar == '\'')) | |||
| { | |||
| currentPart = CommandParserPart.QuotedParameter; | |||
| currentPart = ParserPart.QuotedParameter; | |||
| startPosition = endPosition; | |||
| } | |||
| else if ((!isEscaped && currentChar == ' ') || endPosition >= inputLength) | |||
| else if ((!isEscaped && IsWhiteSpace(currentChar)) || endPosition >= inputLength) | |||
| { | |||
| int length = (currentChar == ' ' ? endPosition - 1 : endPosition) - startPosition; | |||
| string temp = input.Substring(startPosition, length); | |||
| @@ -115,28 +122,28 @@ namespace Discord.Commands | |||
| startPosition = endPosition; | |||
| else | |||
| { | |||
| currentPart = CommandParserPart.None; | |||
| currentPart = ParserPart.None; | |||
| argList.Add(temp); | |||
| startPosition = endPosition; | |||
| } | |||
| } | |||
| break; | |||
| case CommandParserPart.QuotedParameter: | |||
| case ParserPart.QuotedParameter: | |||
| if ((!isEscaped && currentChar == '\'')) | |||
| { | |||
| string temp = input.Substring(startPosition, endPosition - startPosition - 1); | |||
| currentPart = CommandParserPart.None; | |||
| currentPart = ParserPart.None; | |||
| argList.Add(temp); | |||
| startPosition = endPosition; | |||
| } | |||
| else if (endPosition >= inputLength) | |||
| return CommandErrorType.InvalidInput; | |||
| break; | |||
| case CommandParserPart.DoubleQuotedParameter: | |||
| case ParserPart.DoubleQuotedParameter: | |||
| if ((!isEscaped && currentChar == '\"')) | |||
| { | |||
| string temp = input.Substring(startPosition, endPosition - startPosition - 1); | |||
| currentPart = CommandParserPart.None; | |||
| currentPart = ParserPart.None; | |||
| argList.Add(temp); | |||
| startPosition = endPosition; | |||
| } | |||