|
23 | 23 | // |
24 | 24 | package org.incendo.cloud.parser.standard; |
25 | 25 |
|
| 26 | +import java.util.ArrayList; |
26 | 27 | import java.util.Arrays; |
27 | 28 | import java.util.Collection; |
28 | 29 | import java.util.Collections; |
29 | 30 | import java.util.HashSet; |
| 31 | +import java.util.List; |
30 | 32 | import java.util.Set; |
31 | 33 | import java.util.TreeSet; |
32 | 34 | import org.apiguardian.api.API; |
33 | 35 | import org.checkerframework.checker.nullness.qual.NonNull; |
| 36 | +import org.checkerframework.checker.nullness.qual.Nullable; |
34 | 37 | import org.incendo.cloud.context.CommandContext; |
35 | 38 | import org.incendo.cloud.context.CommandInput; |
36 | 39 | import org.incendo.cloud.parser.ArgumentParseResult; |
@@ -62,6 +65,7 @@ public final class LiteralParser<C> implements ArgumentParser<C, String>, Blocki |
62 | 65 | private final String name; |
63 | 66 |
|
64 | 67 | private LiteralParser(final @NonNull String name, final @NonNull String... aliases) { |
| 68 | + validateNames(name, aliases); |
65 | 69 | this.name = name; |
66 | 70 | this.allAcceptedAliases.add(this.name); |
67 | 71 | this.allAcceptedAliases.addAll(Arrays.asList(aliases)); |
@@ -119,7 +123,35 @@ private LiteralParser(final @NonNull String name, final @NonNull String... alias |
119 | 123 | * @param alias New alias |
120 | 124 | */ |
121 | 125 | public void insertAlias(final @NonNull String alias) { |
| 126 | + validateNames("valid", new String[]{alias}); |
122 | 127 | this.allAcceptedAliases.add(alias); |
123 | 128 | this.alternativeAliases.add(alias); |
124 | 129 | } |
| 130 | + |
| 131 | + private static void validateNames(final String name, final @NonNull String[] aliases) { |
| 132 | + @Nullable List<String> errors = null; |
| 133 | + errors = validateName(name, false, errors); |
| 134 | + for (final String alias : aliases) { |
| 135 | + errors = validateName(alias, true, errors); |
| 136 | + } |
| 137 | + if (errors != null && !errors.isEmpty()) { |
| 138 | + throw new IllegalArgumentException(String.join("\n", errors)); |
| 139 | + } |
| 140 | + } |
| 141 | + |
| 142 | + @SuppressWarnings("checkstyle:FinalParameters") |
| 143 | + private static @Nullable List<String> validateName( |
| 144 | + final @NonNull String name, |
| 145 | + final boolean alias, |
| 146 | + @Nullable List<String> errors |
| 147 | + ) { |
| 148 | + final int found = name.codePoints().filter(Character::isWhitespace).findFirst().orElse(Integer.MIN_VALUE); |
| 149 | + if (found != Integer.MIN_VALUE) { |
| 150 | + if (errors == null) { |
| 151 | + errors = new ArrayList<>(); |
| 152 | + } |
| 153 | + errors.add(String.format("%s '%s' is invalid: contains whitespace", alias ? "Alias" : "Name", name)); |
| 154 | + } |
| 155 | + return errors; |
| 156 | + } |
125 | 157 | } |
0 commit comments