From 8d06976136cb1652ceff81c918eaf9447468af2d Mon Sep 17 00:00:00 2001 From: UnlegitDqrk Date: Mon, 2 Feb 2026 20:04:55 +0100 Subject: [PATCH] Added Argument System --- README.MD | 25 +++++++ pom.xml | 2 +- .../unlegitlibrary/argument/Argument.java | 71 ++++++++++++++++++ .../argument/ArgumentParser.java | 73 +++++++++++++++++++ .../unlegitlibrary/argument/ArgumentRun.java | 15 ++++ 5 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dev/unlegitdqrk/unlegitlibrary/argument/Argument.java create mode 100644 src/main/java/dev/unlegitdqrk/unlegitlibrary/argument/ArgumentParser.java create mode 100644 src/main/java/dev/unlegitdqrk/unlegitlibrary/argument/ArgumentRun.java diff --git a/README.MD b/README.MD index 2ef361e..a0c9491 100644 --- a/README.MD +++ b/README.MD @@ -11,6 +11,31 @@ and a wide set of math/number/string/file/reflection helpers. - Command system: command manager, permissions, execution events - Network system: TCP/UDP transport, packet handling, optional TLS, UDP encryption - Utilities: math/number helpers, strings, colors, files, reflection, logging + - Argument parsing: register arguments, validate values, run callbacks + +## ArgumentParser +Basic usage +```java +ArgumentParser parser = new ArgumentParser(args); + +Argument verbose = new Argument("verbose", "Enable verbose output", false); +verbose.setRun((arg, value) -> System.out.println("Verbose on")); +parser.registerArgument(verbose); + +Argument mode = new Argument("mode", "Run mode", true, true, false, List.of("dev", "prod")); +mode.setRun((arg, value) -> System.out.println("Mode: " + value.orElse(""))); +parser.registerArgument(mode); + +parser.runArguments(); +``` + +Value rules +- Constructor: `Argument(name, description, required, requireValue, optionalValue, values)` +- `requireValue=false` and `optionalValue=false`: argument has no value +- `requireValue=true` and `optionalValue=false`: value must be present +- `requireValue=false` and `optionalValue=true`: value is optional +- `requireValue=true` and `optionalValue=true` is not allowed +- If `values` is not empty, the provided value must be in that list ## License Information GNU General Public License v3.0 (GPLv3)
diff --git a/pom.xml b/pom.xml index aad9dfc..3f59c2f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ dev.unlegitdqrk unlegitlibrary - 1.7.9 + 1.8.0 https://unlegitdqrk.dev/ Just a big library diff --git a/src/main/java/dev/unlegitdqrk/unlegitlibrary/argument/Argument.java b/src/main/java/dev/unlegitdqrk/unlegitlibrary/argument/Argument.java new file mode 100644 index 0000000..7b4c47b --- /dev/null +++ b/src/main/java/dev/unlegitdqrk/unlegitlibrary/argument/Argument.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2026 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package dev.unlegitdqrk.unlegitlibrary.argument; + +import java.util.ArrayList; +import java.util.List; + +public class Argument { + + private final String name; + private final String description; + private final boolean required; + private final List values; + private final boolean requireValue; + private final boolean optionalValue; + private ArgumentRun run; + + public ArgumentRun getRun() { + return run; + } + + public void setRun(ArgumentRun run) { + this.run = run; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public boolean isRequired() { + return required; + } + + public List getValues() { + return values; + } + + public boolean isRequireValue() { + return requireValue; + } + + public boolean isOptionalValue() { + return optionalValue; + } + + public Argument(String name, String description, boolean argRequired) { + this(name, description, argRequired, false, false, new ArrayList<>()); + } + + public Argument(String name, String description, boolean argRequired, boolean requireValue, boolean optionalValue, List values) { + if (requireValue && optionalValue) { + throw new IllegalArgumentException("requireValue and optionalValue cannot both be true"); + } + this.name = name; + this.description = description; + this.required = argRequired; + this.values = values == null ? new ArrayList<>() : values; + this.requireValue = requireValue; + this.optionalValue = optionalValue; + } +} diff --git a/src/main/java/dev/unlegitdqrk/unlegitlibrary/argument/ArgumentParser.java b/src/main/java/dev/unlegitdqrk/unlegitlibrary/argument/ArgumentParser.java new file mode 100644 index 0000000..4c5fb0b --- /dev/null +++ b/src/main/java/dev/unlegitdqrk/unlegitlibrary/argument/ArgumentParser.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2026 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package dev.unlegitdqrk.unlegitlibrary.argument; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +public class ArgumentParser { + + private final String[] args; + private final List arguments; + private final List runnedArguments; + + public ArgumentParser(String[] args) { + this.args = args; + this.arguments = new ArrayList<>(); + this.runnedArguments = new ArrayList<>(); + } + + public void registerArgument(Argument arg) { + arguments.add(arg); + } + + public void unregisterArgument(Argument arg) { + arguments.remove(arg); + } + + public void runArguments() { + arguments.stream().filter(Argument::isRequired).forEach(arg -> { + if (!Arrays.stream(args).toList().contains(arg.getName())) { + throw new IllegalArgumentException("Missing argument: " + arg.getName()); + } + }); + + for (int i = 0; i <= args.length - 1; i++) { + String arg = args[i]; + + for (Argument argument : arguments) { + if (argument.getName().equalsIgnoreCase(arg)) { + if (argument.isRequireValue()) { + if (i + 1 >= args.length) { + if (argument.isOptionalValue()) { + if (argument.getRun() != null) argument.getRun().onRun(argument, Optional.empty()); + } else { + throw new IllegalArgumentException("Missing value for argument: " + argument.getName()); + } + } else { + String value = args[i + 1]; + if (!argument.getValues().isEmpty() && !argument.getValues().contains(value)) { + StringBuilder possibleValues = new StringBuilder(); + for (int i1 = 0; i1 < argument.getValues().size(); i1++) { + possibleValues.append(argument.getValues().get(i1)); + if (i1 != argument.getValues().size() - 1) possibleValues.append(", "); + } + + throw new IllegalArgumentException("Invalid argument value '" + value + "' for argument '" + argument.getName() + "'! Possible: " + possibleValues.toString()); + } else if (argument.getRun() != null) argument.getRun().onRun(argument, Optional.of(value)); + i++; + } + } else if (argument.getRun() != null) argument.getRun().onRun(argument, Optional.empty()); + } + } + } + } +} diff --git a/src/main/java/dev/unlegitdqrk/unlegitlibrary/argument/ArgumentRun.java b/src/main/java/dev/unlegitdqrk/unlegitlibrary/argument/ArgumentRun.java new file mode 100644 index 0000000..35148dc --- /dev/null +++ b/src/main/java/dev/unlegitdqrk/unlegitlibrary/argument/ArgumentRun.java @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2026 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package dev.unlegitdqrk.unlegitlibrary.argument; + +import java.util.Optional; + +public abstract class ArgumentRun { + public abstract void onRun(Argument argument, Optional value); +}