@jsprismarine/brigadier 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +0 -0
- package/README.md +57 -39
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/AmbiguityConsumer.js +0 -0
- package/dist/lib/AmbiguityConsumer.js.map +0 -0
- package/dist/lib/Command.js +0 -0
- package/dist/lib/Command.js.map +0 -0
- package/dist/lib/CommandDispatcher.js +45 -28
- package/dist/lib/CommandDispatcher.js.map +1 -1
- package/dist/lib/ImmutableStringReader.js +0 -0
- package/dist/lib/ImmutableStringReader.js.map +0 -0
- package/dist/lib/LiteralMessage.js +0 -0
- package/dist/lib/LiteralMessage.js.map +0 -0
- package/dist/lib/Message.js +0 -0
- package/dist/lib/Message.js.map +0 -0
- package/dist/lib/ParseResults.js +0 -0
- package/dist/lib/ParseResults.js.map +0 -0
- package/dist/lib/Predicate.js +0 -0
- package/dist/lib/Predicate.js.map +0 -0
- package/dist/lib/RedirectModifier.js +0 -0
- package/dist/lib/RedirectModifier.js.map +0 -0
- package/dist/lib/ResultConsumer.js +0 -0
- package/dist/lib/ResultConsumer.js.map +0 -0
- package/dist/lib/SingleRedirectModifier.js +0 -0
- package/dist/lib/SingleRedirectModifier.js.map +0 -0
- package/dist/lib/StringReader.js +0 -0
- package/dist/lib/StringReader.js.map +0 -0
- package/dist/lib/arguments/ArgumentType.js +1 -1
- package/dist/lib/arguments/ArgumentType.js.map +1 -1
- package/dist/lib/arguments/BoolArgumentType.js +0 -0
- package/dist/lib/arguments/BoolArgumentType.js.map +0 -0
- package/dist/lib/arguments/FloatArgumentType.js +0 -0
- package/dist/lib/arguments/FloatArgumentType.js.map +0 -0
- package/dist/lib/arguments/IntegerArgumentType.js +0 -0
- package/dist/lib/arguments/IntegerArgumentType.js.map +0 -0
- package/dist/lib/arguments/StringArgumentType.js +0 -0
- package/dist/lib/arguments/StringArgumentType.js.map +0 -0
- package/dist/lib/builder/ArgumentBuilder.js +0 -0
- package/dist/lib/builder/ArgumentBuilder.js.map +0 -0
- package/dist/lib/builder/LiteralArgumentBuilder.js +0 -0
- package/dist/lib/builder/LiteralArgumentBuilder.js.map +1 -1
- package/dist/lib/builder/RequiredArgumentBuilder.js +0 -0
- package/dist/lib/builder/RequiredArgumentBuilder.js.map +1 -1
- package/dist/lib/context/CommandContext.js +4 -4
- package/dist/lib/context/CommandContext.js.map +1 -1
- package/dist/lib/context/CommandContextBuilder.js +0 -0
- package/dist/lib/context/CommandContextBuilder.js.map +0 -0
- package/dist/lib/context/ParsedArgument.js +0 -0
- package/dist/lib/context/ParsedArgument.js.map +0 -0
- package/dist/lib/context/ParsedCommandNode.js +0 -0
- package/dist/lib/context/ParsedCommandNode.js.map +0 -0
- package/dist/lib/context/StringRange.js +0 -0
- package/dist/lib/context/StringRange.js.map +0 -0
- package/dist/lib/context/SuggestionContext.js +0 -0
- package/dist/lib/context/SuggestionContext.js.map +0 -0
- package/dist/lib/exceptions/BuiltInExceptionProvider.js +0 -0
- package/dist/lib/exceptions/BuiltInExceptionProvider.js.map +0 -0
- package/dist/lib/exceptions/BuiltInExceptions.js +0 -0
- package/dist/lib/exceptions/BuiltInExceptions.js.map +0 -0
- package/dist/lib/exceptions/CommandExceptionType.js +0 -0
- package/dist/lib/exceptions/CommandExceptionType.js.map +0 -0
- package/dist/lib/exceptions/CommandSyntaxException.js +0 -0
- package/dist/lib/exceptions/CommandSyntaxException.js.map +0 -0
- package/dist/lib/exceptions/DynamicCommandExceptionType.js +0 -0
- package/dist/lib/exceptions/DynamicCommandExceptionType.js.map +0 -0
- package/dist/lib/exceptions/SimpleCommandExceptionType.js +0 -0
- package/dist/lib/exceptions/SimpleCommandExceptionType.js.map +0 -0
- package/dist/lib/suggestion/IntegerSuggestion.js +0 -0
- package/dist/lib/suggestion/IntegerSuggestion.js.map +0 -0
- package/dist/lib/suggestion/Suggestion.js +1 -1
- package/dist/lib/suggestion/Suggestion.js.map +1 -1
- package/dist/lib/suggestion/SuggestionProvider.js +0 -0
- package/dist/lib/suggestion/SuggestionProvider.js.map +0 -0
- package/dist/lib/suggestion/Suggestions.js +1 -1
- package/dist/lib/suggestion/Suggestions.js.map +1 -1
- package/dist/lib/suggestion/SuggestionsBuilder.js +0 -0
- package/dist/lib/suggestion/SuggestionsBuilder.js.map +0 -0
- package/dist/lib/tree/ArgumentCommandNode.js +17 -16
- package/dist/lib/tree/ArgumentCommandNode.js.map +1 -1
- package/dist/lib/tree/CommandNode.js +14 -13
- package/dist/lib/tree/CommandNode.js.map +1 -1
- package/dist/lib/tree/LiteralCommandNode.js +0 -0
- package/dist/lib/tree/LiteralCommandNode.js.map +0 -0
- package/dist/lib/tree/RootCommandNode.js +0 -0
- package/dist/lib/tree/RootCommandNode.js.map +0 -0
- package/dist/lib/util/isEqual.js +0 -0
- package/dist/lib/util/isEqual.js.map +0 -0
- package/index.js +0 -0
- package/package.json +55 -48
- package/.prettierrc +0 -10
- package/.renovaterc +0 -3
- package/CHANGELOG.md +0 -30
- package/dist/index.d.ts +0 -23
- package/dist/lib/AmbiguityConsumer.d.ts +0 -4
- package/dist/lib/Command.d.ts +0 -4
- package/dist/lib/CommandDispatcher.d.ts +0 -29
- package/dist/lib/ImmutableStringReader.d.ts +0 -12
- package/dist/lib/LiteralMessage.d.ts +0 -7
- package/dist/lib/Message.d.ts +0 -3
- package/dist/lib/ParseResults.d.ts +0 -13
- package/dist/lib/Predicate.d.ts +0 -3
- package/dist/lib/Primitive.js +0 -2
- package/dist/lib/RedirectModifier.d.ts +0 -4
- package/dist/lib/ResultConsumer.d.ts +0 -4
- package/dist/lib/SingleRedirectModifier.d.ts +0 -4
- package/dist/lib/StringReader.d.ts +0 -27
- package/dist/lib/arguments/ArgumentType.d.ts +0 -21
- package/dist/lib/arguments/BoolArgumentType.d.ts +0 -13
- package/dist/lib/arguments/FloatArgumentType.d.ts +0 -16
- package/dist/lib/arguments/IntegerArgumentType.d.ts +0 -16
- package/dist/lib/arguments/StringArgumentType.d.ts +0 -21
- package/dist/lib/builder/ArgumentBuilder.d.ts +0 -28
- package/dist/lib/builder/LiteralArgumentBuilder.d.ts +0 -11
- package/dist/lib/builder/RequiredArgumentBuilder.d.ts +0 -18
- package/dist/lib/context/CommandContext.d.ts +0 -33
- package/dist/lib/context/CommandContextBuilder.d.ts +0 -38
- package/dist/lib/context/ParsedArgument.d.ts +0 -9
- package/dist/lib/context/ParsedCommandNode.d.ts +0 -11
- package/dist/lib/context/StringRange.d.ts +0 -16
- package/dist/lib/context/SuggestionContext.d.ts +0 -6
- package/dist/lib/exceptions/BuiltInExceptionProvider.d.ts +0 -23
- package/dist/lib/exceptions/BuiltInExceptions.d.ts +0 -43
- package/dist/lib/exceptions/CommandExceptionType.d.ts +0 -2
- package/dist/lib/exceptions/CommandSyntaxException.d.ts +0 -19
- package/dist/lib/exceptions/Dynamic2CommandExceptionType.js +0 -19
- package/dist/lib/exceptions/DynamicCommandExceptionType.d.ts +0 -10
- package/dist/lib/exceptions/SimpleCommandExceptionType.d.ts +0 -11
- package/dist/lib/suggestion/IntegerSuggestion.d.ts +0 -12
- package/dist/lib/suggestion/Suggestion.d.ts +0 -17
- package/dist/lib/suggestion/SuggestionProvider.d.ts +0 -6
- package/dist/lib/suggestion/Suggestions.d.ts +0 -16
- package/dist/lib/suggestion/SuggestionsBuilder.d.ts +0 -18
- package/dist/lib/tree/ArgumentCommandNode.d.ts +0 -31
- package/dist/lib/tree/CommandNode.d.ts +0 -45
- package/dist/lib/tree/LiteralCommandNode.d.ts +0 -27
- package/dist/lib/tree/RootCommandNode.d.ts +0 -21
- package/dist/lib/util/isEqual.d.ts +0 -1
- package/example/fill.js +0 -47
- package/example/fill.ts +0 -50
- package/src/index.ts +0 -50
- package/src/lib/AmbiguityConsumer.ts +0 -6
- package/src/lib/Command.ts +0 -5
- package/src/lib/CommandDispatcher.ts +0 -390
- package/src/lib/ImmutableStringReader.ts +0 -22
- package/src/lib/LiteralMessage.ts +0 -17
- package/src/lib/Message.ts +0 -3
- package/src/lib/ParseResults.ts +0 -32
- package/src/lib/Predicate.ts +0 -3
- package/src/lib/RedirectModifier.ts +0 -5
- package/src/lib/ResultConsumer.ts +0 -6
- package/src/lib/SingleRedirectModifier.ts +0 -6
- package/src/lib/StringReader.ts +0 -210
- package/src/lib/arguments/ArgumentType.ts +0 -27
- package/src/lib/arguments/BoolArgumentType.ts +0 -41
- package/src/lib/arguments/FloatArgumentType.ts +0 -75
- package/src/lib/arguments/IntegerArgumentType.ts +0 -75
- package/src/lib/arguments/StringArgumentType.ts +0 -83
- package/src/lib/builder/ArgumentBuilder.ts +0 -94
- package/src/lib/builder/LiteralArgumentBuilder.ts +0 -35
- package/src/lib/builder/RequiredArgumentBuilder.ts +0 -54
- package/src/lib/context/CommandContext.ts +0 -118
- package/src/lib/context/CommandContextBuilder.ts +0 -155
- package/src/lib/context/ParsedArgument.ts +0 -27
- package/src/lib/context/ParsedCommandNode.ts +0 -35
- package/src/lib/context/StringRange.ts +0 -57
- package/src/lib/context/SuggestionContext.ts +0 -12
- package/src/lib/exceptions/BuiltInExceptionProvider.ts +0 -43
- package/src/lib/exceptions/BuiltInExceptions.ts +0 -121
- package/src/lib/exceptions/CommandExceptionType.ts +0 -2
- package/src/lib/exceptions/CommandSyntaxException.ts +0 -77
- package/src/lib/exceptions/DynamicCommandExceptionType.ts +0 -22
- package/src/lib/exceptions/SimpleCommandExceptionType.ts +0 -26
- package/src/lib/suggestion/IntegerSuggestion.ts +0 -46
- package/src/lib/suggestion/Suggestion.ts +0 -87
- package/src/lib/suggestion/SuggestionProvider.ts +0 -7
- package/src/lib/suggestion/Suggestions.ts +0 -85
- package/src/lib/suggestion/SuggestionsBuilder.ts +0 -69
- package/src/lib/tree/ArgumentCommandNode.ts +0 -118
- package/src/lib/tree/CommandNode.ts +0 -200
- package/src/lib/tree/LiteralCommandNode.ts +0 -111
- package/src/lib/tree/RootCommandNode.ts +0 -62
- package/src/lib/util/isEqual.ts +0 -75
- package/test/CommandDispatcherTest.ts +0 -427
- package/test/CommandDispatcherUsagesTest.ts +0 -163
- package/test/CommandSuggestionsTest.ts +0 -283
- package/test/StringReaderTest.ts +0 -391
- package/test/arguments/BoolArgumentTypeTest.ts +0 -18
- package/test/arguments/FloatArgumentTypeTest.ts +0 -61
- package/test/arguments/IntegerArgumentTypeTest.ts +0 -63
- package/test/arguments/StringArgumentTypeTest.ts +0 -61
- package/test/benchmarks/ExecuteBenchmark.js +0 -33
- package/test/benchmarks/ParsingBenchmark.js +0 -96
- package/test/builder/ArgumentBuilderTest.ts +0 -61
- package/test/builder/LiteralArgumentBuilderTest.ts +0 -37
- package/test/builder/RequiredArgumentBuilderTest.ts +0 -40
- package/test/context/CommandContextTest.ts +0 -77
- package/test/context/ParsedArgumentTest.ts +0 -19
- package/test/exceptions/DynamicCommandSyntaxExceptionTypeTest.ts +0 -18
- package/test/exceptions/SimpleCommandSyntaxExceptionTypeTest.ts +0 -33
- package/test/suggestion/SuggestionBuilderTest.ts +0 -66
- package/test/suggestion/SuggestionTest.ts +0 -65
- package/test/suggestion/SuggestionsTest.ts +0 -24
- package/test/tree/AbstractCommandNodeTest.ts +0 -57
- package/test/tree/ArgumentCommandNodeTest.ts +0 -81
- package/test/tree/LiteralCommandNodeTest.ts +0 -112
- package/test/tree/RootCommandNodeTest.ts +0 -70
- package/test/utils/testEquality.ts +0 -10
- package/tsconfig.json +0 -40
- package/tsconfig.tsbuildinfo +0 -1578
package/src/lib/StringReader.ts
DELETED
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import ImmutableStringReader from "./ImmutableStringReader"
|
|
2
|
-
import CommandSyntaxException from "./exceptions/CommandSyntaxException"
|
|
3
|
-
|
|
4
|
-
const SYNTAX_ESCAPE = '\\';
|
|
5
|
-
const SYNTAX_QUOTE = '\"';
|
|
6
|
-
|
|
7
|
-
export default class StringReader implements ImmutableStringReader {
|
|
8
|
-
|
|
9
|
-
private string: string;
|
|
10
|
-
private cursor: number = 0;
|
|
11
|
-
|
|
12
|
-
public constructor (other: string | StringReader) {
|
|
13
|
-
if(typeof other === "string") {
|
|
14
|
-
this.string = other;
|
|
15
|
-
} else {
|
|
16
|
-
this.string = other.string;
|
|
17
|
-
this.cursor = other.cursor;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public getString(): string {
|
|
22
|
-
return this.string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public setCursor(cursor: number) {
|
|
26
|
-
this.cursor = cursor;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
public getRemainingLength(): number {
|
|
30
|
-
return (this.string.length - this.cursor);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
public getTotalLength(): number {
|
|
34
|
-
return this.string.length;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
public getCursor(): number {
|
|
39
|
-
return this.cursor;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
public getRead(): string {
|
|
44
|
-
return this.string.substring(0, this.cursor);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
public getRemaining(): string {
|
|
49
|
-
return this.string.substring(this.cursor);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
public canRead(length = 1): boolean {
|
|
53
|
-
return this.cursor + length <= this.string.length;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
public peek(offset: number = 0): string {
|
|
57
|
-
return this.string.charAt(this.cursor + offset);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
public read(): string {
|
|
61
|
-
return this.string.charAt(this.cursor++);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
public skip() {
|
|
65
|
-
this.cursor++;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
public static isAllowedNumber(c: string): boolean {
|
|
69
|
-
return c >= '0' && c <= '9' || c == '.' || c == '-' || c == '+' || c == 'e' || c == 'E';
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
public skipWhitespace() {
|
|
73
|
-
while ((this.canRead() && /\s/.test(this.peek()))) {
|
|
74
|
-
this.skip();
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
public readInt(): number {
|
|
80
|
-
let start = this.cursor;
|
|
81
|
-
while (this.canRead() && StringReader.isAllowedNumber(this.peek())) {
|
|
82
|
-
this.skip();
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
let number = this.string.substring(start, this.cursor);
|
|
86
|
-
if (number.length === 0) {
|
|
87
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.readerExpectedInt().createWithContext(this);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
const result = parseFloat(number);
|
|
91
|
-
if (isNaN(result) || result !== Math.round(result)) {
|
|
92
|
-
this.cursor = start;
|
|
93
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.readerInvalidInt().createWithContext(this, number);
|
|
94
|
-
} else
|
|
95
|
-
return result;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
public readFloat(): number {
|
|
99
|
-
let start = this.cursor;
|
|
100
|
-
while ((this.canRead() && StringReader.isAllowedNumber(this.peek()))) {
|
|
101
|
-
this.skip();
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
let number = this.string.substring(start, this.cursor);
|
|
105
|
-
if (number.length === 0) {
|
|
106
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.readerExpectedFloat().createWithContext(this);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const result = parseFloat(number);
|
|
110
|
-
if (isNaN(result) || result !== Number(number)) {
|
|
111
|
-
this.cursor = start;
|
|
112
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.readerInvalidFloat().createWithContext(this, number);
|
|
113
|
-
} else
|
|
114
|
-
return result;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
public static isAllowedInUnquotedString(c: string): boolean {
|
|
118
|
-
return c >= '0' && c <= '9'
|
|
119
|
-
|| c >= 'A' && c <= 'Z'
|
|
120
|
-
|| c >= 'a' && c <= 'z'
|
|
121
|
-
|| c == '_' || c == '-'
|
|
122
|
-
|| c == '.' || c == '+';
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
public readUnquotedString(): string {
|
|
126
|
-
let start = this.cursor;
|
|
127
|
-
while (this.canRead() && StringReader.isAllowedInUnquotedString(this.peek())) {
|
|
128
|
-
this.skip();
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return this.string.substring(start, this.cursor);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
public readQuotedString(): string {
|
|
135
|
-
if (!this.canRead()) {
|
|
136
|
-
return "";
|
|
137
|
-
}
|
|
138
|
-
else if ((this.peek() != SYNTAX_QUOTE)) {
|
|
139
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.readerExpectedStartOfQuote().createWithContext(this);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
this.skip();
|
|
143
|
-
let result = "";
|
|
144
|
-
let escaped = false;
|
|
145
|
-
while (this.canRead()) {
|
|
146
|
-
let c = this.read();
|
|
147
|
-
if (escaped) {
|
|
148
|
-
if (c == SYNTAX_QUOTE || c == SYNTAX_ESCAPE) {
|
|
149
|
-
result += c;
|
|
150
|
-
escaped = false;
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
this.setCursor(this.getCursor() - 1);
|
|
154
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.readerInvalidEscape().createWithContext(this, c);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
}
|
|
158
|
-
else if (c == SYNTAX_ESCAPE) {
|
|
159
|
-
escaped = true;
|
|
160
|
-
}
|
|
161
|
-
else if (c == SYNTAX_QUOTE) {
|
|
162
|
-
return result;
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
result += c;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.readerExpectedEndOfQuote().createWithContext(this);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
public readString(): string {
|
|
174
|
-
if (this.canRead() && (this.peek() === SYNTAX_QUOTE)) {
|
|
175
|
-
return this.readQuotedString();
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
return this.readUnquotedString();
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
public readBoolean(): boolean {
|
|
184
|
-
let start = this.cursor;
|
|
185
|
-
let value = this.readString();
|
|
186
|
-
if (value.length === 0) {
|
|
187
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.readerExpectedBool().createWithContext(this);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
if (value === "true") {
|
|
191
|
-
return true;
|
|
192
|
-
}
|
|
193
|
-
else if (value === "false") {
|
|
194
|
-
return false;
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
this.cursor = start;
|
|
198
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.readerInvalidBool().createWithContext(this, value);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
public expect(c: string) {
|
|
204
|
-
if (!this.canRead() || this.peek() !== c) {
|
|
205
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.readerExpectedSymbol().createWithContext(this, c);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
this.skip();
|
|
209
|
-
}
|
|
210
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import StringReader from "../StringReader"
|
|
2
|
-
import CommandContext from "../context/CommandContext"
|
|
3
|
-
import Suggestions from "../suggestion/Suggestions"
|
|
4
|
-
import SuggestionsBuilder from "../suggestion/SuggestionsBuilder"
|
|
5
|
-
|
|
6
|
-
import BoolArgumentType from "./BoolArgumentType"
|
|
7
|
-
import IntegerArgumentType from "./IntegerArgumentType"
|
|
8
|
-
import FloatArgumentType from "./FloatArgumentType"
|
|
9
|
-
import StringArgumentType from "./StringArgumentType"
|
|
10
|
-
|
|
11
|
-
export const DefaultType = {
|
|
12
|
-
bool: BoolArgumentType.bool,
|
|
13
|
-
integer: IntegerArgumentType.integer,
|
|
14
|
-
float: FloatArgumentType.float,
|
|
15
|
-
word: StringArgumentType.word,
|
|
16
|
-
string: StringArgumentType.string,
|
|
17
|
-
greedyString: StringArgumentType.greedyString
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export default interface ArgumentType<T> {
|
|
21
|
-
|
|
22
|
-
parse(reader: StringReader): T;
|
|
23
|
-
|
|
24
|
-
listSuggestions?<S>(context: CommandContext<S>, builder: SuggestionsBuilder): Promise<Suggestions>;
|
|
25
|
-
|
|
26
|
-
getExamples?(): Iterable<string>;
|
|
27
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import StringReader from "../StringReader"
|
|
2
|
-
import CommandContext from "../context/CommandContext"
|
|
3
|
-
import Suggestions from "../suggestion/Suggestions"
|
|
4
|
-
import SuggestionsBuilder from "../suggestion/SuggestionsBuilder"
|
|
5
|
-
import ArgumentType from "./ArgumentType"
|
|
6
|
-
|
|
7
|
-
const EXAMPLES = ["true", "false"];
|
|
8
|
-
|
|
9
|
-
export default class BoolArgumentType implements ArgumentType<boolean> {
|
|
10
|
-
|
|
11
|
-
private constructor () {
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
public static bool(): BoolArgumentType {
|
|
15
|
-
return new BoolArgumentType();
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
public static getBool(context: CommandContext<any>, name: string): boolean {
|
|
19
|
-
return context.getArgument(name, Boolean);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
public parse(reader: StringReader): boolean {
|
|
23
|
-
return reader.readBoolean();
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
public listSuggestions(context: CommandContext<any>, builder: SuggestionsBuilder): Promise<Suggestions> {
|
|
27
|
-
if ("true".startsWith(builder.getRemaining().toLowerCase())) {
|
|
28
|
-
builder.suggest("true");
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
if ("false".startsWith(builder.getRemaining().toLowerCase())) {
|
|
32
|
-
builder.suggest("false");
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return builder.buildPromise();
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
public getExamples(): Iterable<string> {
|
|
39
|
-
return EXAMPLES;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import StringReader from "../StringReader"
|
|
2
|
-
import CommandContext from "../context/CommandContext"
|
|
3
|
-
import CommandSyntaxException from "../exceptions/CommandSyntaxException"
|
|
4
|
-
import Suggestions from "../suggestion/Suggestions"
|
|
5
|
-
import SuggestionsBuilder from "../suggestion/SuggestionsBuilder"
|
|
6
|
-
import ArgumentType from "./ArgumentType"
|
|
7
|
-
|
|
8
|
-
const EXAMPLES = ["0", "1.2", ".5", "-1", "-.5", "-1234.56"];
|
|
9
|
-
|
|
10
|
-
export default class FloatArgumentType implements ArgumentType<number> {
|
|
11
|
-
|
|
12
|
-
private minimum: number;
|
|
13
|
-
private maximum: number;
|
|
14
|
-
|
|
15
|
-
private constructor (minimum: number, maximum: number) {
|
|
16
|
-
this.minimum = minimum;
|
|
17
|
-
this.maximum = maximum;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public static float(min: number = -Infinity, max: number = Infinity): FloatArgumentType {
|
|
21
|
-
return new FloatArgumentType(min, max);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
public static getFloat(context: CommandContext<any>, name: string): number {
|
|
25
|
-
return context.getArgument(name, Number);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
public getMinimum(): number {
|
|
29
|
-
return this.minimum;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
public getMaximum(): number {
|
|
33
|
-
return this.maximum;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
public parse(reader: StringReader): number {
|
|
37
|
-
let start = reader.getCursor();
|
|
38
|
-
let result = reader.readFloat();
|
|
39
|
-
if (result < this.minimum) {
|
|
40
|
-
reader.setCursor(start);
|
|
41
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.integerTooLow().createWithContext(reader, result, this.minimum);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (result > this.maximum) {
|
|
45
|
-
reader.setCursor(start);
|
|
46
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.integerTooHigh().createWithContext(reader, result, this.maximum);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return result;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
public equals(o: object): boolean {
|
|
53
|
-
if (this === o) return true;
|
|
54
|
-
|
|
55
|
-
if (!(o instanceof FloatArgumentType)) return false;
|
|
56
|
-
|
|
57
|
-
return this.maximum == o.maximum && this.minimum == o.minimum;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
public toString(): string {
|
|
61
|
-
if (this.minimum === -Infinity && this.maximum === Infinity) {
|
|
62
|
-
return "float()";
|
|
63
|
-
}
|
|
64
|
-
else if (this.maximum == Infinity) {
|
|
65
|
-
return "float(" + this.minimum + ")";
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
return "float(" + this.minimum + ", " + this.maximum + ")";
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
public getExamples(): Iterable<string> {
|
|
73
|
-
return EXAMPLES;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import StringReader from "../StringReader"
|
|
2
|
-
import CommandContext from "../context/CommandContext"
|
|
3
|
-
import CommandSyntaxException from "../exceptions/CommandSyntaxException"
|
|
4
|
-
import Suggestions from "../suggestion/Suggestions"
|
|
5
|
-
import SuggestionsBuilder from "../suggestion/SuggestionsBuilder"
|
|
6
|
-
import ArgumentType from "./ArgumentType"
|
|
7
|
-
|
|
8
|
-
const EXAMPLES = ["0", "123", "-123"];
|
|
9
|
-
|
|
10
|
-
export default class IntegerArgumentType implements ArgumentType<number> {
|
|
11
|
-
|
|
12
|
-
private minimum: number;
|
|
13
|
-
private maximum: number;
|
|
14
|
-
|
|
15
|
-
private constructor (minimum: number, maximum: number) {
|
|
16
|
-
this.minimum = minimum;
|
|
17
|
-
this.maximum = maximum;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public static integer(min: number = -Infinity, max: number = Infinity): IntegerArgumentType {
|
|
21
|
-
return new IntegerArgumentType(min, max);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
public static getInteger(context: CommandContext<any>, name: string): number {
|
|
25
|
-
return context.getArgument(name, Number);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
public getMinimum(): number {
|
|
29
|
-
return this.minimum;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
public getMaximum(): number {
|
|
33
|
-
return this.maximum;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
public parse(reader: StringReader): number {
|
|
37
|
-
let start = reader.getCursor();
|
|
38
|
-
let result = reader.readInt();
|
|
39
|
-
if (result < this.minimum) {
|
|
40
|
-
reader.setCursor(start);
|
|
41
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.integerTooLow().createWithContext(reader, result, this.minimum);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (result > this.maximum) {
|
|
45
|
-
reader.setCursor(start);
|
|
46
|
-
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.integerTooHigh().createWithContext(reader, result, this.maximum);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return result;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
public equals(o: object): boolean {
|
|
53
|
-
if (this === o) return true;
|
|
54
|
-
|
|
55
|
-
if (!(o instanceof IntegerArgumentType)) return false;
|
|
56
|
-
|
|
57
|
-
return this.maximum == o.maximum && this.minimum == o.minimum;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
public toString(): string {
|
|
61
|
-
if (this.minimum === -Infinity && this.maximum === Infinity) {
|
|
62
|
-
return "integer()";
|
|
63
|
-
}
|
|
64
|
-
else if (this.maximum == Infinity) {
|
|
65
|
-
return "integer(" + this.minimum + ")";
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
return "integer(" + this.minimum + ", " + this.maximum + ")";
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
public getExamples(): Iterable<string> {
|
|
73
|
-
return EXAMPLES;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import StringReader from "../StringReader"
|
|
2
|
-
import CommandContext from "../context/CommandContext"
|
|
3
|
-
import Suggestions from "../suggestion/Suggestions"
|
|
4
|
-
import SuggestionsBuilder from "../suggestion/SuggestionsBuilder"
|
|
5
|
-
import ArgumentType from "./ArgumentType"
|
|
6
|
-
|
|
7
|
-
export enum StringType {
|
|
8
|
-
SINGLE_WORD = "words_with_underscores",
|
|
9
|
-
QUOTABLE_PHRASE = "\"quoted phrase\"",
|
|
10
|
-
GREEDY_PHRASE = "words with spaces"
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export default class StringArgumentType implements ArgumentType<string> {
|
|
14
|
-
|
|
15
|
-
private type: StringType;
|
|
16
|
-
|
|
17
|
-
private constructor (type: StringType) {
|
|
18
|
-
this.type = type;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public static word(): StringArgumentType {
|
|
22
|
-
return new StringArgumentType(StringType.SINGLE_WORD);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public static string(): StringArgumentType {
|
|
26
|
-
return new StringArgumentType(StringType.QUOTABLE_PHRASE);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
public static greedyString(): StringArgumentType {
|
|
30
|
-
return new StringArgumentType(StringType.GREEDY_PHRASE);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
public static getString(context: CommandContext<any>, name: string): string {
|
|
34
|
-
return context.getArgument(name, String);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
public getType(): StringType {
|
|
38
|
-
return this.type;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
public parse(reader: StringReader): string {
|
|
42
|
-
if (this.type == StringType.GREEDY_PHRASE) {
|
|
43
|
-
let text = reader.getRemaining();
|
|
44
|
-
reader.setCursor(reader.getTotalLength());
|
|
45
|
-
return text;
|
|
46
|
-
}
|
|
47
|
-
else if (this.type == StringType.SINGLE_WORD) {
|
|
48
|
-
return reader.readUnquotedString();
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
return reader.readString();
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
public toString(): string {
|
|
57
|
-
return "string()";
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
public static escapeIfRequired(input: string): String {
|
|
61
|
-
for (let c of input) {
|
|
62
|
-
if (!StringReader.isAllowedInUnquotedString(c)) {
|
|
63
|
-
return StringArgumentType.escape(input);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return input;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
private static escape(input: string): string {
|
|
71
|
-
let result = "\"";
|
|
72
|
-
for (let i = 0; i < input.length; i++) {
|
|
73
|
-
const c = input.charAt(i);
|
|
74
|
-
if (c == '\\' || c == '"') {
|
|
75
|
-
result += '\\';
|
|
76
|
-
}
|
|
77
|
-
result += c;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
result += "\"";
|
|
81
|
-
return result;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import Command from "../Command"
|
|
2
|
-
import RedirectModifier from "../RedirectModifier"
|
|
3
|
-
import SingleRedirectModifier from "../SingleRedirectModifier"
|
|
4
|
-
import CommandNode from "../tree/CommandNode"
|
|
5
|
-
import RootCommandNode from "../tree/RootCommandNode"
|
|
6
|
-
import Predicate from "../Predicate"
|
|
7
|
-
import CommandContext from "../context/CommandContext";
|
|
8
|
-
|
|
9
|
-
abstract class ArgumentBuilder<S, T extends ArgumentBuilder<S, T>> {
|
|
10
|
-
|
|
11
|
-
private args: RootCommandNode<S> = new RootCommandNode();
|
|
12
|
-
|
|
13
|
-
private command: Command<S>;
|
|
14
|
-
|
|
15
|
-
private requirement: Predicate<S>;
|
|
16
|
-
|
|
17
|
-
private target: CommandNode<S>;
|
|
18
|
-
|
|
19
|
-
private modifier: RedirectModifier<S> = null;
|
|
20
|
-
|
|
21
|
-
private forks: boolean;
|
|
22
|
-
|
|
23
|
-
public abstract getThis(): T;
|
|
24
|
-
|
|
25
|
-
public then(arg: ArgumentBuilder<S, any> | CommandNode<S>): T {
|
|
26
|
-
if (!(this.target == null)) {
|
|
27
|
-
throw new Error("Cannot add children to a redirected node");
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (arg instanceof CommandNode)
|
|
31
|
-
this.args.addChild(arg)
|
|
32
|
-
else
|
|
33
|
-
this.args.addChild(arg.build());
|
|
34
|
-
|
|
35
|
-
return this.getThis();
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
public getArguments(): Iterable<CommandNode<S>> {
|
|
39
|
-
return this.args.getChildren();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
public executes(command: Command<S>): T {
|
|
43
|
-
this.command = command;
|
|
44
|
-
return this.getThis();
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
public getCommand(): Command<S> {
|
|
48
|
-
return this.command;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
public requires(requirement: Predicate<S>): T {
|
|
52
|
-
this.requirement = requirement;
|
|
53
|
-
return this.getThis();
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
public getRequirement(): Predicate<S> {
|
|
57
|
-
return this.requirement;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
public redirect(target: CommandNode<S>, modifier?: SingleRedirectModifier<S>): T {
|
|
61
|
-
return this.forward(target, modifier == null ? null : (o: CommandContext<S>) => [ modifier.apply(o) ], false);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
public fork(target: CommandNode<S>, modifier: RedirectModifier<S>): T {
|
|
65
|
-
return this.forward(target, modifier, true);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
public forward(target: CommandNode<S>, modifier: RedirectModifier<S>, fork: boolean): T {
|
|
69
|
-
if (this.args.getChildrenCount() > 0) {
|
|
70
|
-
throw new Error("Cannot forward a node with children");
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
this.target = target;
|
|
74
|
-
this.modifier = modifier;
|
|
75
|
-
this.forks = fork;
|
|
76
|
-
return this.getThis();
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
public getRedirect(): CommandNode<S> {
|
|
80
|
-
return this.target;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
public getRedirectModifier(): RedirectModifier<S> {
|
|
84
|
-
return this.modifier;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
public isFork(): boolean {
|
|
88
|
-
return this.forks;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
public abstract build(): CommandNode<S>;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export default ArgumentBuilder;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import LiteralCommandNode from "../tree/LiteralCommandNode"
|
|
2
|
-
import ArgumentBuilder from "./ArgumentBuilder"
|
|
3
|
-
|
|
4
|
-
export default class LiteralArgumentBuilder<S> extends ArgumentBuilder<S, LiteralArgumentBuilder<S>> {
|
|
5
|
-
|
|
6
|
-
private literal: string;
|
|
7
|
-
|
|
8
|
-
public constructor (literal: string) {
|
|
9
|
-
super();
|
|
10
|
-
this.literal = literal;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
public static literal<S>(name: string): LiteralArgumentBuilder<S> {
|
|
14
|
-
return new LiteralArgumentBuilder(name);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
public getThis(): LiteralArgumentBuilder<S> {
|
|
18
|
-
return this;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public getLiteral(): string {
|
|
22
|
-
return this.literal;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public build(): LiteralCommandNode<S> {
|
|
26
|
-
let result: LiteralCommandNode<S> = new LiteralCommandNode(this.getLiteral(), this.getCommand(), this.getRequirement(), this.getRedirect(), this.getRedirectModifier(), this.isFork());
|
|
27
|
-
for (let arg of this.getArguments()) {
|
|
28
|
-
result.addChild(arg);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return result;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export const literal = LiteralArgumentBuilder.literal;
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import ArgumentType from "../arguments/ArgumentType"
|
|
2
|
-
import SuggestionProvider from "../suggestion/SuggestionProvider"
|
|
3
|
-
import ArgumentCommandNode from "../tree/ArgumentCommandNode"
|
|
4
|
-
import ArgumentBuilder from "./ArgumentBuilder"
|
|
5
|
-
|
|
6
|
-
export default class RequiredArgumentBuilder<S, T> extends ArgumentBuilder<S, RequiredArgumentBuilder<S, T>> {
|
|
7
|
-
|
|
8
|
-
private name: string;
|
|
9
|
-
|
|
10
|
-
private type: ArgumentType<T>;
|
|
11
|
-
|
|
12
|
-
private suggestionsProvider: SuggestionProvider<S>;
|
|
13
|
-
|
|
14
|
-
private constructor (name: string, type: ArgumentType<T>) {
|
|
15
|
-
super();
|
|
16
|
-
this.name = name;
|
|
17
|
-
this.type = type;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public static argument<S, T>(name: string, type: ArgumentType<T>): RequiredArgumentBuilder<S, T> {
|
|
21
|
-
return new RequiredArgumentBuilder(name, type);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
public suggests(provider: SuggestionProvider<S>): RequiredArgumentBuilder<S, T> {
|
|
25
|
-
this.suggestionsProvider = provider;
|
|
26
|
-
return this.getThis();
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
public getSuggestionsProvider(): SuggestionProvider<S> {
|
|
30
|
-
return this.suggestionsProvider;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
public getThis(): RequiredArgumentBuilder<S, T> {
|
|
34
|
-
return this;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
public getType(): ArgumentType<T> {
|
|
38
|
-
return this.type;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
public getName(): string {
|
|
42
|
-
return this.name;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
public build(): ArgumentCommandNode<S, T> {
|
|
46
|
-
let result: ArgumentCommandNode<S, T> = new ArgumentCommandNode(this.getName(), this.getType(), this.getCommand(), this.getRequirement(), this.getRedirect(), this.getRedirectModifier(), this.isFork(), this.getSuggestionsProvider());
|
|
47
|
-
for (let arg of this.getArguments()) {
|
|
48
|
-
result.addChild(arg);
|
|
49
|
-
}
|
|
50
|
-
return result;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export const argument = RequiredArgumentBuilder.argument;
|