Skip to content

Commit a14bc55

Browse files
committed
Can now parse all enums by default, and add infrastructure to parse any generic type
1 parent 4a12992 commit a14bc55

File tree

16 files changed

+170
-23
lines changed

16 files changed

+170
-23
lines changed
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package fr.zcraft.quartzlib.components.commands;
22

3+
import fr.zcraft.quartzlib.components.commands.exceptions.ArgumentParseException;
4+
35
@FunctionalInterface
46
public interface ArgumentType<T> {
5-
T parse(String raw);
7+
T parse(String raw) throws ArgumentParseException;
68
}

src/main/java/fr/zcraft/quartzlib/components/commands/ArgumentTypeHandler.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package fr.zcraft.quartzlib.components.commands;
22

3-
import fr.zcraft.quartzlib.components.commands.ArgumentType;
4-
5-
public class ArgumentTypeHandler<T> {
3+
class ArgumentTypeHandler<T> {
64
private final Class<T> resultType;
75
private final ArgumentType<T> typeHandler;
86

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package fr.zcraft.quartzlib.components.commands;
22

3-
import fr.zcraft.quartzlib.components.commands.arguments.primitive.IntegerTypeHandler;
3+
import fr.zcraft.quartzlib.components.commands.arguments.generic.EnumArgumentType;
4+
import fr.zcraft.quartzlib.components.commands.arguments.primitive.IntegerArgumentType;
5+
import org.jetbrains.annotations.Nullable;
46

5-
import java.util.HashMap;
6-
import java.util.Map;
7-
import java.util.Optional;
7+
import java.util.*;
88

99
class ArgumentTypeHandlerCollection {
1010
private final Map<Class<?>, ArgumentTypeHandler<?>> argumentTypeHandlerMap = new HashMap<>();
11+
private final List<GenericArgumentType<?>> genericArgumentTypes = new ArrayList<>();
1112

1213
public ArgumentTypeHandlerCollection () {
1314
this.registerNativeTypes();
@@ -18,13 +19,34 @@ public <T> void register(ArgumentTypeHandler<T> typeHandler)
1819
argumentTypeHandlerMap.put(typeHandler.getResultType(), typeHandler);
1920
}
2021

22+
public <T> void register(GenericArgumentType<T> genericArgumentType) {
23+
genericArgumentTypes.add(genericArgumentType);
24+
}
25+
2126
public Optional<ArgumentTypeHandler<?>> findTypeHandler(Class<?> resultType) {
22-
return Optional.ofNullable(argumentTypeHandlerMap.get(resultType));
27+
ArgumentTypeHandler<?> typeHandler = argumentTypeHandlerMap.get(resultType);
28+
if (typeHandler != null) return Optional.of(typeHandler);
29+
return this.findGenericTypeHandler(resultType);
2330
}
2431

25-
private void registerNativeTypes () {
26-
register(new ArgumentTypeHandler<>(Integer.class, new IntegerTypeHandler()));
32+
private <T> Optional<ArgumentTypeHandler<?>> findGenericTypeHandler(Class<T> resultType) {
33+
for (GenericArgumentType<?> t : genericArgumentTypes) {
34+
Optional<? extends ArgumentType<?>> matchingArgumentType = t.getMatchingArgumentType(resultType);
2735

36+
if (matchingArgumentType.isPresent()) {
37+
ArgumentTypeHandler<?> typeHandler = new ArgumentTypeHandler<>(resultType, (ArgumentType<T>) matchingArgumentType.get());
38+
return Optional.of(typeHandler);
39+
}
40+
}
41+
return Optional.empty();
42+
}
43+
44+
private void registerNativeTypes () {
45+
// Primitive types
46+
register(new ArgumentTypeHandler<>(Integer.class, new IntegerArgumentType()));
2847
register(new ArgumentTypeHandler<>(String.class, s -> s));
48+
49+
// Generic types
50+
register(new EnumArgumentType());
2951
}
3052
}

src/main/java/fr/zcraft/quartzlib/components/commands/CommandEndpoint.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package fr.zcraft.quartzlib.components.commands;
22

3+
import fr.zcraft.quartzlib.components.commands.exceptions.CommandException;
4+
35
import java.util.ArrayList;
46
import java.util.List;
57

@@ -11,7 +13,7 @@ class CommandEndpoint extends CommandNode {
1113
}
1214

1315
@Override
14-
void run(Object instance, String[] args) {
16+
void run(Object instance, String[] args) throws CommandException {
1517
this.methods.get(0).run(instance, args);
1618
}
1719

src/main/java/fr/zcraft/quartzlib/components/commands/CommandGroup.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package fr.zcraft.quartzlib.components.commands;
22

3+
import fr.zcraft.quartzlib.components.commands.exceptions.CommandException;
4+
35
import java.util.Arrays;
46
import java.util.HashMap;
57
import java.util.Map;
@@ -37,13 +39,13 @@ private void addMethod(CommandMethod method) {
3739
endpoint.addMethod(method);
3840
}
3941

40-
void run(String... args) {
42+
void run(String... args) throws CommandException {
4143
Object commandObject = classInstanceSupplier.get();
4244
run(commandObject, args);
4345
}
4446

4547
@Override
46-
void run(Object instance, String[] args) {
48+
void run(Object instance, String[] args) throws CommandException {
4749
String commandName = args[0];
4850
CommandNode subCommand = subCommands.get(commandName);
4951
subCommand.run(instance, Arrays.copyOfRange(args, 1, args.length));

src/main/java/fr/zcraft/quartzlib/components/commands/CommandManager.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package fr.zcraft.quartzlib.components.commands;
22

3+
import fr.zcraft.quartzlib.components.commands.exceptions.CommandException;
4+
35
import java.util.HashMap;
46
import java.util.Map;
57
import java.util.function.Supplier;
@@ -13,7 +15,7 @@ public <T> void registerCommand(String name, Class<T> commandType, Supplier<T> c
1315
rootCommands.put(name, group);
1416
}
1517

16-
public void run(String commandName, String... args) {
18+
public void run(String commandName, String... args) throws CommandException {
1719
((CommandGroup) rootCommands.get(commandName)).run(args); // TODO
1820
}
1921
}

src/main/java/fr/zcraft/quartzlib/components/commands/CommandMethod.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package fr.zcraft.quartzlib.components.commands;
22

3+
import fr.zcraft.quartzlib.components.commands.exceptions.ArgumentParseException;
4+
import fr.zcraft.quartzlib.components.commands.exceptions.CommandException;
5+
36
import java.lang.reflect.InvocationTargetException;
47
import java.lang.reflect.Method;
58
import java.util.Arrays;
@@ -22,7 +25,7 @@ public String getName() {
2225
return name;
2326
}
2427

25-
public void run(Object target, String[] args) {
28+
public void run(Object target, String[] args) throws CommandException {
2629
Object[] parsedArgs = parseArguments(args);
2730
try {
2831
this.method.invoke(target, parsedArgs);
@@ -31,7 +34,7 @@ public void run(Object target, String[] args) {
3134
}
3235
}
3336

34-
private Object[] parseArguments(String[] args) {
37+
private Object[] parseArguments(String[] args) throws ArgumentParseException {
3538
Object[] parsed = new Object[args.length];
3639

3740
for (int i = 0; i < args.length; i++) {

src/main/java/fr/zcraft/quartzlib/components/commands/CommandMethodArgument.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package fr.zcraft.quartzlib.components.commands;
22

3+
import fr.zcraft.quartzlib.components.commands.exceptions.ArgumentParseException;
4+
35
import java.lang.reflect.Parameter;
46

57
public class CommandMethodArgument {
@@ -11,7 +13,7 @@ public CommandMethodArgument(Parameter parameter, ArgumentTypeHandlerCollection
1113
this.typeHandler = typeHandlerCollection.findTypeHandler(parameter.getType()).get(); // FIXME: handle unknown types
1214
}
1315

14-
public Object parse(String raw) {
16+
public Object parse(String raw) throws ArgumentParseException {
1517
return this.typeHandler.getTypeHandler().parse(raw);
1618
}
1719
}

src/main/java/fr/zcraft/quartzlib/components/commands/CommandNode.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package fr.zcraft.quartzlib.components.commands;
22

3+
import fr.zcraft.quartzlib.components.commands.exceptions.CommandException;
4+
35
abstract class CommandNode {
46
private final String name;
57
private final CommandGroup parent;
@@ -17,5 +19,5 @@ public CommandGroup getParent() {
1719
return parent;
1820
}
1921

20-
abstract void run(Object instance, String[] args);
22+
abstract void run(Object instance, String[] args) throws CommandException;
2123
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package fr.zcraft.quartzlib.components.commands;
2+
3+
import java.util.Optional;
4+
5+
public interface GenericArgumentType<T> {
6+
Optional<ArgumentType<T>> getMatchingArgumentType(Class<?> type);
7+
}

0 commit comments

Comments
 (0)