@@ -4,7 +4,7 @@ namespace Discord.Commands
{
internal static class CommandParser
{
private enum Command ParserPart
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)
{
Command ParserPart currentPart = Command ParserPart.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 = Command ParserPart.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 = Command ParserPart.None;
currentPart = ParserPart.None;
argList.Add(temp);
startPosition = endPosition;
}
}
break;
case Command ParserPart.QuotedParameter:
case ParserPart.QuotedParameter:
if ((!isEscaped && currentChar == '\''))
{
string temp = input.Substring(startPosition, endPosition - startPosition - 1);
currentPart = Command ParserPart.None;
currentPart = ParserPart.None;
argList.Add(temp);
startPosition = endPosition;
}
else if (endPosition >= inputLength)
return CommandErrorType.InvalidInput;
break;
case Command ParserPart.DoubleQuotedParameter:
case ParserPart.DoubleQuotedParameter:
if ((!isEscaped && currentChar == '\"'))
{
string temp = input.Substring(startPosition, endPosition - startPosition - 1);
currentPart = Command ParserPart.None;
currentPart = ParserPart.None;
argList.Add(temp);
startPosition = endPosition;
}