From 75e59c9fe61e50b5e0103c240d71a4d3efd5626d Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Sun, 4 Jul 2021 20:53:46 -0700 Subject: [PATCH] Clean up StringParser --- .../arguments/standard/StringArgument.java | 106 ++++++++++-------- 1 file changed, 58 insertions(+), 48 deletions(-) diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/StringArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/StringArgument.java index 76f79d66..b5c7d1b4 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/StringArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/StringArgument.java @@ -311,62 +311,72 @@ public final class StringArgument extends CommandArgument { inputQueue.remove(); return ArgumentParseResult.success(input); } else if (this.stringMode == StringMode.QUOTED) { - final StringJoiner sj = new StringJoiner(" "); - for (final String string : inputQueue) { - sj.add(string); - } - final String string = sj.toString(); + return this.parseQuoted(commandContext, inputQueue); + } else { + return this.parseGreedy(commandContext, inputQueue); + } + } - final Matcher doubleMatcher = QUOTED_DOUBLE.matcher(string); - String doubleMatch = null; - if (doubleMatcher.find()) { - doubleMatch = doubleMatcher.group("inner"); - } - final Matcher singleMatcher = QUOTED_SINGLE.matcher(string); - String singleMatch = null; - if (singleMatcher.find()) { - singleMatch = singleMatcher.group("inner"); - } + private @NonNull ArgumentParseResult parseQuoted( + final @NonNull CommandContext commandContext, + final @NonNull Queue<@NonNull String> inputQueue + ) { + final StringJoiner sj = new StringJoiner(" "); + for (final String string : inputQueue) { + sj.add(string); + } + final String string = sj.toString(); - String inner = null; - if (singleMatch != null && doubleMatch != null) { - final int singleIndex = string.indexOf(singleMatch); - final int doubleIndex = string.indexOf(doubleMatch); - inner = doubleIndex < singleIndex ? doubleMatch : singleMatch; - } else if (singleMatch == null && doubleMatch != null) { - inner = doubleMatch; - } else if (singleMatch != null) { - inner = singleMatch; - } - - if (inner != null) { - final int numSpaces = StringUtils.countCharOccurrences(inner, ' '); - for (int i = 0; i <= numSpaces; i++) { - inputQueue.remove(); - } - } else { - inner = inputQueue.remove(); - if (inner.startsWith("\"") || inner.startsWith("'")) { - return ArgumentParseResult.failure(new StringParseException(sj.toString(), - StringMode.QUOTED, commandContext - )); - } - } - - inner = inner.replace("\\\"", "\"").replace("\\'", "'"); - - return ArgumentParseResult.success(inner); + final Matcher doubleMatcher = QUOTED_DOUBLE.matcher(string); + String doubleMatch = null; + if (doubleMatcher.find()) { + doubleMatch = doubleMatcher.group("inner"); + } + final Matcher singleMatcher = QUOTED_SINGLE.matcher(string); + String singleMatch = null; + if (singleMatcher.find()) { + singleMatch = singleMatcher.group("inner"); } + String inner = null; + if (singleMatch != null && doubleMatch != null) { + final int singleIndex = string.indexOf(singleMatch); + final int doubleIndex = string.indexOf(doubleMatch); + inner = doubleIndex < singleIndex ? doubleMatch : singleMatch; + } else if (singleMatch == null && doubleMatch != null) { + inner = doubleMatch; + } else if (singleMatch != null) { + inner = singleMatch; + } + + if (inner != null) { + final int numSpaces = StringUtils.countCharOccurrences(inner, ' '); + for (int i = 0; i <= numSpaces; i++) { + inputQueue.remove(); + } + } else { + inner = inputQueue.remove(); + if (inner.startsWith("\"") || inner.startsWith("'")) { + return ArgumentParseResult.failure(new StringParseException(sj.toString(), + StringMode.QUOTED, commandContext + )); + } + } + + inner = inner.replace("\\\"", "\"").replace("\\'", "'"); + + return ArgumentParseResult.success(inner); + } + + private @NonNull ArgumentParseResult parseGreedy( + final @NonNull CommandContext commandContext, + final @NonNull Queue<@NonNull String> inputQueue + ) { final StringJoiner sj = new StringJoiner(" "); final int size = inputQueue.size(); - boolean started = false; - boolean finished = false; - - char start = ' '; for (int i = 0; i < size; i++) { - String string = inputQueue.peek(); + final String string = inputQueue.peek(); if (string == null) { break;