diff options
Diffstat (limited to 'dicore3/command/src/main/java/io/dico/dicore/command/parameter/type/NumberParameterType.java')
-rw-r--r-- | dicore3/command/src/main/java/io/dico/dicore/command/parameter/type/NumberParameterType.java | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/parameter/type/NumberParameterType.java b/dicore3/command/src/main/java/io/dico/dicore/command/parameter/type/NumberParameterType.java new file mode 100644 index 0000000..ed53cb0 --- /dev/null +++ b/dicore3/command/src/main/java/io/dico/dicore/command/parameter/type/NumberParameterType.java @@ -0,0 +1,55 @@ +package io.dico.dicore.command.parameter.type; + +import io.dico.dicore.command.CommandException; +import io.dico.dicore.command.annotation.Range; +import io.dico.dicore.command.parameter.ArgumentBuffer; +import io.dico.dicore.command.parameter.Parameter; +import org.bukkit.command.CommandSender; + +/** + * Abstraction for number parameter types which use {@link Range.Memory} as parameter info. + * + * @param <T> the Number subclass. + */ +public abstract class NumberParameterType<T extends Number> extends ParameterType<T, Range.Memory> { + + public NumberParameterType(Class<T> returnType) { + super(returnType, Range.CONFIG); + } + + protected abstract T parse(String input) throws NumberFormatException; + + protected abstract T select(Number number); + + @Override + public T parse(Parameter<T, Range.Memory> parameter, CommandSender sender, ArgumentBuffer buffer) throws CommandException { + //System.out.println("In NumberParameterType:parse() for class " + getReturnType().toGenericString()); + + String input = buffer.next(); + if (input == null) { + throw CommandException.missingArgument(parameter.getName()); + } + + T result; + try { + result = parse(input); + } catch (Exception ex) { + throw CommandException.invalidArgument(parameter.getName(), "a number"); + } + + Range.Memory memory = (Range.Memory) parameter.getParamInfo(); + if (memory != null) { + memory.validate(result, "Argument " + parameter.getName() + " is out of range [" + + select(memory.min()) + ", " + select(memory.max()) + "]: " + result); + } + + return result; + } + + @Override + public T getDefaultValue(Parameter<T, Range.Memory> parameter, CommandSender sender, ArgumentBuffer buffer) throws CommandException { + Range.Memory memory = (Range.Memory) parameter.getParamInfo(); + return select(memory != null ? memory.defaultValue() : 0); + } + +} |