From 6729242034ca8055a230eac530431b69f3c4fcd9 Mon Sep 17 00:00:00 2001 From: Robin Cheney Date: Thu, 20 Nov 2025 09:56:39 +0100 Subject: [PATCH] Version 1.1 --- .gitignore | 3 +- pom.xml | 6 +- .../de/ddnss/eternal/utils/ArrayUtils.java | 15 +++- .../de/ddnss/eternal/utils/StringUtils.java | 13 +++ .../java/de/ddnss/eternal/utils/Test.java | 46 ---------- .../utils/io/error/InvalidArgumentsError.java | 17 ++++ .../utils/io/input/AvailableCommands.java | 45 +++++++++- .../ddnss/eternal/utils/io/input/Command.java | 89 +++++++++++++++++-- .../utils/io/input/CommandInterface.java | 7 -- .../eternal/utils/io/input/CommandOption.java | 9 ++ .../utils/io/input/ParameterizedCommand.java | 32 ------- .../utils/io/input/user/CMDCommands.java | 16 +++- .../utils/io/input/user/UserInput.java | 18 +++- 13 files changed, 209 insertions(+), 107 deletions(-) delete mode 100644 src/main/java/de/ddnss/eternal/utils/Test.java create mode 100644 src/main/java/de/ddnss/eternal/utils/io/error/InvalidArgumentsError.java delete mode 100644 src/main/java/de/ddnss/eternal/utils/io/input/CommandInterface.java delete mode 100644 src/main/java/de/ddnss/eternal/utils/io/input/ParameterizedCommand.java diff --git a/.gitignore b/.gitignore index 7bb4c2f..5c661bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ target/* -de/ddnss/eternal/utils/Test.java \ No newline at end of file +*/Test.java +.vscode/* \ No newline at end of file diff --git a/pom.xml b/pom.xml index c5a0ca4..b9d7a8f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,12 +1,12 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 de.ddnss.eternal.utils utils - 1.0 + 1.1 17 diff --git a/src/main/java/de/ddnss/eternal/utils/ArrayUtils.java b/src/main/java/de/ddnss/eternal/utils/ArrayUtils.java index 930d97f..e9540a4 100644 --- a/src/main/java/de/ddnss/eternal/utils/ArrayUtils.java +++ b/src/main/java/de/ddnss/eternal/utils/ArrayUtils.java @@ -2,16 +2,23 @@ package de.ddnss.eternal.utils; import java.util.ArrayList; -public abstract class ArrayUtils { - public static Object[] reverse(Object[] array) { +/** + * This has some methods for working with Arrays. + * + * @author Robin Cheney + * + * @since 1.1 + */ +public abstract class ArrayUtils { + public E[] reverse(E[] array) { - ArrayList outArray = new ArrayList(); + ArrayList outArray = new ArrayList(); for (int i = 0; i < array.length; i++) { // prepend each character outArray.add(array[i]); } - return outArray.toArray(new Object[0]); + return outArray.toArray(array); } } diff --git a/src/main/java/de/ddnss/eternal/utils/StringUtils.java b/src/main/java/de/ddnss/eternal/utils/StringUtils.java index eefae33..526f821 100644 --- a/src/main/java/de/ddnss/eternal/utils/StringUtils.java +++ b/src/main/java/de/ddnss/eternal/utils/StringUtils.java @@ -1,6 +1,19 @@ package de.ddnss.eternal.utils; +/** + * String utilities + * + * @author Robin Cheney + * + * @since 1.0 + */ public abstract class StringUtils { + /** + * Returns the given {@link String} in reversed order + * + * @param string The normal {@link String} + * @return The reversed {@link String} + */ public static String reverse(String string) { String outString = ""; diff --git a/src/main/java/de/ddnss/eternal/utils/Test.java b/src/main/java/de/ddnss/eternal/utils/Test.java deleted file mode 100644 index 0ea89ca..0000000 --- a/src/main/java/de/ddnss/eternal/utils/Test.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.ddnss.eternal.utils; - -import de.ddnss.eternal.utils.io.input.user.CMDCommands; - -public class Test { - public static void main(String[] cmdargs) { - - System.out.println("Enter command:"); - - while (true) { - // System.out.print("> "); - // String line = scanner.nextLine().trim(); - - // // Skip empty input - // if (line.isEmpty()) - // continue; - - // // Split into tokens (command + args) - // String[] parts = line.split("\\s+"); - CMDCommands.scan(); - } - } - - // private static void handleSay(String[] args) { - // if (args.length == 0) { - // System.out.println("Usage: say "); - // return; - // } - // System.out.println(String.join(" ", args)); - // } - - // private static void handleAdd(String[] args) { - // if (args.length != 2) { - // System.out.println("Usage: add "); - // return; - // } - - // try { - // int a = Integer.parseInt(args[0]); - // int b = Integer.parseInt(args[1]); - // System.out.println("Result: " + (a + b)); - // } catch (NumberFormatException e) { - // System.out.println("Arguments must be numbers."); - // } - // } -} diff --git a/src/main/java/de/ddnss/eternal/utils/io/error/InvalidArgumentsError.java b/src/main/java/de/ddnss/eternal/utils/io/error/InvalidArgumentsError.java new file mode 100644 index 0000000..cb200c0 --- /dev/null +++ b/src/main/java/de/ddnss/eternal/utils/io/error/InvalidArgumentsError.java @@ -0,0 +1,17 @@ +package de.ddnss.eternal.utils.io.error; + +import de.ddnss.eternal.utils.io.input.CommandOption; + +/** + * Thrown when an {@link CommandOption} object does not fit the requirements of + * the function it was passed to + * + * @author Robin Cheney + * + * @since 1.1 + */ +public class InvalidArgumentsError extends Exception { + public InvalidArgumentsError(Exception e) { + super(e); + } +} diff --git a/src/main/java/de/ddnss/eternal/utils/io/input/AvailableCommands.java b/src/main/java/de/ddnss/eternal/utils/io/input/AvailableCommands.java index 9d02d76..58d9084 100644 --- a/src/main/java/de/ddnss/eternal/utils/io/input/AvailableCommands.java +++ b/src/main/java/de/ddnss/eternal/utils/io/input/AvailableCommands.java @@ -2,19 +2,58 @@ package de.ddnss.eternal.utils.io.input; import java.util.function.Function; +/** + * An enum of available {@link Command commands} + * + * @author Robin Cheney + * + * @since 1.1 + */ public enum AvailableCommands { + EXIT(() -> { + System.exit(0); + }), + SAY((CommandOption args) -> { + System.out.println("HI"); System.out.println(args.get("SAY")); return null; + }), + + GREET(() -> { + System.out.println("Hi"); }); - public final CommandInterface command; + public final Command command; + /** + * Constructs an {@link AvailableCommand} from a result-less {@link Function} + * with given {@link CommandOption}<{@link String}> + * + * @apiNote This would immediately bind the parameters to the function. This is + * not very useful + * @param command A {@link Function} that returns null + * @param arguments A {@link CommandOption} object + */ private AvailableCommands(Function, Void> command, CommandOption arguments) { - this.command = new ParameterizedCommand(command, arguments); + this.command = new Command(command, arguments); } + /** + * Constructs an {@link AvailableCommand} from a result-less {@link Function} + * + * @param command A {@link Function} that returns null + */ private AvailableCommands(Function, Void> command) { - this.command = new ParameterizedCommand(command); + this.command = new Command(command); + } + + /** + * Constructs an {@link AvailableCommand} from a {@link Runnable} + * + * @param command A {@link Runnable} + */ + private AvailableCommands(Runnable command) { + this.command = new Command(command); } } diff --git a/src/main/java/de/ddnss/eternal/utils/io/input/Command.java b/src/main/java/de/ddnss/eternal/utils/io/input/Command.java index 429298e..5f19821 100644 --- a/src/main/java/de/ddnss/eternal/utils/io/input/Command.java +++ b/src/main/java/de/ddnss/eternal/utils/io/input/Command.java @@ -1,19 +1,90 @@ package de.ddnss.eternal.utils.io.input; -public final class Command implements CommandInterface { - final Runnable command; +import java.util.function.Function; - public Command(Runnable command) { +import de.ddnss.eternal.utils.io.error.InvalidArgumentsError; + +/** + * Class for instantiating commands with parameter type {@code E} + * + * @author Robin Cheney + * + * @since 1.1 + */ +public class Command { + /** + * The command to be executed. Must be passed as a runnable to the constructor + * or if parameters are necessary, it must be a {@link Function} that takes a + * {@link CommandOption} as the single parameter and always returns null + */ + final Function, Void> command; + CommandOption arguments; + + /** + * + * @param command + * @param arguments + */ + public Command(Function, Void> command, CommandOption arguments) { this.command = command; + this.arguments = arguments; } - @Override - public void exec() { - this.command.run(); + /** + * + * @param command A {@link Function} that takes a {@link CommandOption} + */ + public Command(Function, Void> command) { + this.command = command; } - @Override - public void exec(CommandOption args) { - this.command.run(); + /** + * Constructs a {@link Command} without any parameters + * + * @param command A {@link Runnable} to execute + */ + public Command(Runnable command) { + this.command = (CommandOption undefined) -> { + command.run(); + return null; + }; + } + + /** + * Execute the command with the previously provided arguments + * + * @apiNote This method has a shorthand property where you can provide + * {@link CommandOption command options} + * @see #exec(CommandOption) + * @see #bindArguments(CommandOption) + */ + public void exec() { + this.command.apply(arguments); + }; + + /** + * Binds arguments to the command + * + * @param args A {@link CommandOption} object holding the command arguments and + * their values + * @return the {@link Command} object itself + */ + public Command bindArguments(CommandOption args) { + this.arguments = args; + return this; + }; + + /** + * Executes a command with a {@link CommandOption} + * + * @param arguments A {@link CommandOption} object holding necessary parameters + * @throws InvalidArgumentsError + */ + public void exec(CommandOption arguments) throws InvalidArgumentsError { + try { + this.command.apply(arguments); + } catch (NullPointerException e) { + throw new InvalidArgumentsError(e); + } }; } \ No newline at end of file diff --git a/src/main/java/de/ddnss/eternal/utils/io/input/CommandInterface.java b/src/main/java/de/ddnss/eternal/utils/io/input/CommandInterface.java deleted file mode 100644 index c43491c..0000000 --- a/src/main/java/de/ddnss/eternal/utils/io/input/CommandInterface.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.ddnss.eternal.utils.io.input; - -public interface CommandInterface { - public void exec(); - - public void exec(CommandOption args); -} diff --git a/src/main/java/de/ddnss/eternal/utils/io/input/CommandOption.java b/src/main/java/de/ddnss/eternal/utils/io/input/CommandOption.java index d1d1efe..ac55e28 100644 --- a/src/main/java/de/ddnss/eternal/utils/io/input/CommandOption.java +++ b/src/main/java/de/ddnss/eternal/utils/io/input/CommandOption.java @@ -2,6 +2,15 @@ package de.ddnss.eternal.utils.io.input; import java.util.HashMap; +/** + * Command options container + * + * @apiNote extends {@link HashMap} whose functions you can use + * + * @author Robin Cheney + * + * @since 1.1 + */ public class CommandOption extends HashMap { public CommandOption(String string, E e) { super(); diff --git a/src/main/java/de/ddnss/eternal/utils/io/input/ParameterizedCommand.java b/src/main/java/de/ddnss/eternal/utils/io/input/ParameterizedCommand.java deleted file mode 100644 index 8cc0f72..0000000 --- a/src/main/java/de/ddnss/eternal/utils/io/input/ParameterizedCommand.java +++ /dev/null @@ -1,32 +0,0 @@ -package de.ddnss.eternal.utils.io.input; - -import java.util.function.Function; - -public final class ParameterizedCommand implements CommandInterface { - final Function, Void> command; - CommandOption arguments; - - public ParameterizedCommand(Function, Void> command, CommandOption arguments) { - this.command = command; - this.arguments = arguments; - } - - public ParameterizedCommand(Function, Void> command) { - this.command = command; - } - - @Override - public void exec() { - this.command.apply(arguments); - }; - - @Override - public void exec(CommandOption arguments) { - this.command.apply(arguments); - } - - // @Override - // public void exec(Object args) { - // this.command.apply(args); - // }; -} \ No newline at end of file diff --git a/src/main/java/de/ddnss/eternal/utils/io/input/user/CMDCommands.java b/src/main/java/de/ddnss/eternal/utils/io/input/user/CMDCommands.java index c94b392..67b6b29 100644 --- a/src/main/java/de/ddnss/eternal/utils/io/input/user/CMDCommands.java +++ b/src/main/java/de/ddnss/eternal/utils/io/input/user/CMDCommands.java @@ -5,7 +5,20 @@ import java.util.Scanner; import de.ddnss.eternal.utils.io.input.AvailableCommands; import de.ddnss.eternal.utils.io.input.CommandOption; +/** + * Should be useful for capturing console command + * + * @author Robin Cheney + * + * @since 1.1 + */ public class CMDCommands { + /** + * Creates a scanner that can and will read input and try to evaluate it as a + * {@link Command} + * + * @see AvailableCommands + */ public static void scan() { AvailableCommands command; @@ -29,7 +42,8 @@ public class CMDCommands { System.out.println("Unknown command: " + parts[0]); break; } - command.command.exec(new CommandOption("SAY", parts[0])); + + command.command.bindArguments(new CommandOption("SAY", parts[0])).exec(); } } } diff --git a/src/main/java/de/ddnss/eternal/utils/io/input/user/UserInput.java b/src/main/java/de/ddnss/eternal/utils/io/input/user/UserInput.java index 401bdaf..e83d71e 100644 --- a/src/main/java/de/ddnss/eternal/utils/io/input/user/UserInput.java +++ b/src/main/java/de/ddnss/eternal/utils/io/input/user/UserInput.java @@ -2,11 +2,27 @@ package de.ddnss.eternal.utils.io.input.user; import java.util.Scanner; +/** + * Utility class for utilising user input + * + * @author Robin Cheney + * + * @since 1.1 + */ public class UserInput { + + /** + * Prints a prompt and returns the next line, the user puts in + * + * @param prompt A prompt to be printed before the user input + * @return the user input + * + * @see Scanner#nextLine() + */ public static String prompt(String prompt) { System.out.println(prompt); Scanner input = scanner(); - String result = input.next(); + String result = input.nextLine(); input.close(); return result; } -- 2.43.0