From 6ee19c2f76b44d53e997517dfc5e7d2b29e351bb Mon Sep 17 00:00:00 2001 From: Niklas Date: Thu, 24 Apr 2025 22:31:09 +0200 Subject: [PATCH 1/5] migrate to maven project --- pom.xml | 105 ++++++++++++++++++++++++++ src/test/TestAddParameterMethods.java | 1 - 2 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f9d1783 --- /dev/null +++ b/pom.xml @@ -0,0 +1,105 @@ + + + 4.0.0 + + com.github.AbUndMax + Java_ArgsParser + 6.0.0 + jar + + Java ArgsParser + Simple argument parsing library + https://github.com/AbUndMax/Java_ArgsParser + + + + github + GitHub Packages for Java_ArgsParser + https://maven.pkg.github.com/AbUndMax/Java_ArgsParser + + + + + UTF-8 + 21 + 21 + 5.10.0 + + + + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.1.2 + + + **/*Test*.java + + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + + attach-sources + + jar-no-fork + + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.3.1 + + + attach-javadocs + + jar + + + + + + + + \ No newline at end of file diff --git a/src/test/TestAddParameterMethods.java b/src/test/TestAddParameterMethods.java index b892b18..f459376 100644 --- a/src/test/TestAddParameterMethods.java +++ b/src/test/TestAddParameterMethods.java @@ -1,7 +1,6 @@ import ArgsParser.*; import static org.junit.jupiter.api.Assertions.*; -import ArgsParser.ArgsExceptions.ToggleArgsException; import ArgsParser.ParameterTypes.*; import org.junit.jupiter.api.Test; From d8810f2c742c5eb13a7af4ae1d9dedeb8fdd2939 Mon Sep 17 00:00:00 2001 From: Niklas Date: Sat, 26 Apr 2025 14:21:25 +0200 Subject: [PATCH 2/5] maintain maven project structure --- pom.xml | 2 +- src/{ => main/java}/ArgsParser/ArgsException.java | 0 .../ArgsExceptions/FlagAlreadyProvidedArgsException.java | 0 .../ArgsExceptions/HelpAtWrongPositionArgsException.java | 0 .../ArgsParser/ArgsExceptions/InvalidArgTypeArgsException.java | 0 .../ArgsExceptions/MandatoryArgNotProvidedArgsException.java | 0 .../ArgsParser/ArgsExceptions/MissingArgArgsException.java | 0 .../ArgsExceptions/NoArgumentsProvidedArgsException.java | 0 .../ArgsParser/ArgsExceptions/NotExistingPathArgsException.java | 0 .../java}/ArgsParser/ArgsExceptions/ToggleArgsException.java | 0 .../ArgsExceptions/TooManyArgumentsArgsException.java | 0 .../ArgsParser/ArgsExceptions/UnknownFlagArgsException.java | 0 src/{ => main/java}/ArgsParser/ArgsParser.java | 0 src/{ => main/java}/ArgsParser/CalledForHelpNotification.java | 0 src/{ => main/java}/ArgsParser/Command.java | 0 src/{ => main/java}/ArgsParser/Parameter.java | 0 .../java}/ArgsParser/ParameterTypes/BolArrParameter.java | 0 src/{ => main/java}/ArgsParser/ParameterTypes/BolParameter.java | 0 .../java}/ArgsParser/ParameterTypes/ChrArrParameter.java | 0 src/{ => main/java}/ArgsParser/ParameterTypes/ChrParameter.java | 0 .../java}/ArgsParser/ParameterTypes/DblArrParameter.java | 0 src/{ => main/java}/ArgsParser/ParameterTypes/DblParameter.java | 0 .../java}/ArgsParser/ParameterTypes/FltArrParameter.java | 0 src/{ => main/java}/ArgsParser/ParameterTypes/FltParameter.java | 0 .../java}/ArgsParser/ParameterTypes/IntArrParameter.java | 0 src/{ => main/java}/ArgsParser/ParameterTypes/IntParameter.java | 0 .../java}/ArgsParser/ParameterTypes/PthArrParameter.java | 0 src/{ => main/java}/ArgsParser/ParameterTypes/PthParameter.java | 0 .../java}/ArgsParser/ParameterTypes/StrArrParameter.java | 0 src/{ => main/java}/ArgsParser/ParameterTypes/StrParameter.java | 0 30 files changed, 1 insertion(+), 1 deletion(-) rename src/{ => main/java}/ArgsParser/ArgsException.java (100%) rename src/{ => main/java}/ArgsParser/ArgsExceptions/FlagAlreadyProvidedArgsException.java (100%) rename src/{ => main/java}/ArgsParser/ArgsExceptions/HelpAtWrongPositionArgsException.java (100%) rename src/{ => main/java}/ArgsParser/ArgsExceptions/InvalidArgTypeArgsException.java (100%) rename src/{ => main/java}/ArgsParser/ArgsExceptions/MandatoryArgNotProvidedArgsException.java (100%) rename src/{ => main/java}/ArgsParser/ArgsExceptions/MissingArgArgsException.java (100%) rename src/{ => main/java}/ArgsParser/ArgsExceptions/NoArgumentsProvidedArgsException.java (100%) rename src/{ => main/java}/ArgsParser/ArgsExceptions/NotExistingPathArgsException.java (100%) rename src/{ => main/java}/ArgsParser/ArgsExceptions/ToggleArgsException.java (100%) rename src/{ => main/java}/ArgsParser/ArgsExceptions/TooManyArgumentsArgsException.java (100%) rename src/{ => main/java}/ArgsParser/ArgsExceptions/UnknownFlagArgsException.java (100%) rename src/{ => main/java}/ArgsParser/ArgsParser.java (100%) rename src/{ => main/java}/ArgsParser/CalledForHelpNotification.java (100%) rename src/{ => main/java}/ArgsParser/Command.java (100%) rename src/{ => main/java}/ArgsParser/Parameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/BolArrParameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/BolParameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/ChrArrParameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/ChrParameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/DblArrParameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/DblParameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/FltArrParameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/FltParameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/IntArrParameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/IntParameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/PthArrParameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/PthParameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/StrArrParameter.java (100%) rename src/{ => main/java}/ArgsParser/ParameterTypes/StrParameter.java (100%) diff --git a/pom.xml b/pom.xml index f9d1783..0e25f83 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.AbUndMax - Java_ArgsParser + java_argsparser 6.0.0 jar diff --git a/src/ArgsParser/ArgsException.java b/src/main/java/ArgsParser/ArgsException.java similarity index 100% rename from src/ArgsParser/ArgsException.java rename to src/main/java/ArgsParser/ArgsException.java diff --git a/src/ArgsParser/ArgsExceptions/FlagAlreadyProvidedArgsException.java b/src/main/java/ArgsParser/ArgsExceptions/FlagAlreadyProvidedArgsException.java similarity index 100% rename from src/ArgsParser/ArgsExceptions/FlagAlreadyProvidedArgsException.java rename to src/main/java/ArgsParser/ArgsExceptions/FlagAlreadyProvidedArgsException.java diff --git a/src/ArgsParser/ArgsExceptions/HelpAtWrongPositionArgsException.java b/src/main/java/ArgsParser/ArgsExceptions/HelpAtWrongPositionArgsException.java similarity index 100% rename from src/ArgsParser/ArgsExceptions/HelpAtWrongPositionArgsException.java rename to src/main/java/ArgsParser/ArgsExceptions/HelpAtWrongPositionArgsException.java diff --git a/src/ArgsParser/ArgsExceptions/InvalidArgTypeArgsException.java b/src/main/java/ArgsParser/ArgsExceptions/InvalidArgTypeArgsException.java similarity index 100% rename from src/ArgsParser/ArgsExceptions/InvalidArgTypeArgsException.java rename to src/main/java/ArgsParser/ArgsExceptions/InvalidArgTypeArgsException.java diff --git a/src/ArgsParser/ArgsExceptions/MandatoryArgNotProvidedArgsException.java b/src/main/java/ArgsParser/ArgsExceptions/MandatoryArgNotProvidedArgsException.java similarity index 100% rename from src/ArgsParser/ArgsExceptions/MandatoryArgNotProvidedArgsException.java rename to src/main/java/ArgsParser/ArgsExceptions/MandatoryArgNotProvidedArgsException.java diff --git a/src/ArgsParser/ArgsExceptions/MissingArgArgsException.java b/src/main/java/ArgsParser/ArgsExceptions/MissingArgArgsException.java similarity index 100% rename from src/ArgsParser/ArgsExceptions/MissingArgArgsException.java rename to src/main/java/ArgsParser/ArgsExceptions/MissingArgArgsException.java diff --git a/src/ArgsParser/ArgsExceptions/NoArgumentsProvidedArgsException.java b/src/main/java/ArgsParser/ArgsExceptions/NoArgumentsProvidedArgsException.java similarity index 100% rename from src/ArgsParser/ArgsExceptions/NoArgumentsProvidedArgsException.java rename to src/main/java/ArgsParser/ArgsExceptions/NoArgumentsProvidedArgsException.java diff --git a/src/ArgsParser/ArgsExceptions/NotExistingPathArgsException.java b/src/main/java/ArgsParser/ArgsExceptions/NotExistingPathArgsException.java similarity index 100% rename from src/ArgsParser/ArgsExceptions/NotExistingPathArgsException.java rename to src/main/java/ArgsParser/ArgsExceptions/NotExistingPathArgsException.java diff --git a/src/ArgsParser/ArgsExceptions/ToggleArgsException.java b/src/main/java/ArgsParser/ArgsExceptions/ToggleArgsException.java similarity index 100% rename from src/ArgsParser/ArgsExceptions/ToggleArgsException.java rename to src/main/java/ArgsParser/ArgsExceptions/ToggleArgsException.java diff --git a/src/ArgsParser/ArgsExceptions/TooManyArgumentsArgsException.java b/src/main/java/ArgsParser/ArgsExceptions/TooManyArgumentsArgsException.java similarity index 100% rename from src/ArgsParser/ArgsExceptions/TooManyArgumentsArgsException.java rename to src/main/java/ArgsParser/ArgsExceptions/TooManyArgumentsArgsException.java diff --git a/src/ArgsParser/ArgsExceptions/UnknownFlagArgsException.java b/src/main/java/ArgsParser/ArgsExceptions/UnknownFlagArgsException.java similarity index 100% rename from src/ArgsParser/ArgsExceptions/UnknownFlagArgsException.java rename to src/main/java/ArgsParser/ArgsExceptions/UnknownFlagArgsException.java diff --git a/src/ArgsParser/ArgsParser.java b/src/main/java/ArgsParser/ArgsParser.java similarity index 100% rename from src/ArgsParser/ArgsParser.java rename to src/main/java/ArgsParser/ArgsParser.java diff --git a/src/ArgsParser/CalledForHelpNotification.java b/src/main/java/ArgsParser/CalledForHelpNotification.java similarity index 100% rename from src/ArgsParser/CalledForHelpNotification.java rename to src/main/java/ArgsParser/CalledForHelpNotification.java diff --git a/src/ArgsParser/Command.java b/src/main/java/ArgsParser/Command.java similarity index 100% rename from src/ArgsParser/Command.java rename to src/main/java/ArgsParser/Command.java diff --git a/src/ArgsParser/Parameter.java b/src/main/java/ArgsParser/Parameter.java similarity index 100% rename from src/ArgsParser/Parameter.java rename to src/main/java/ArgsParser/Parameter.java diff --git a/src/ArgsParser/ParameterTypes/BolArrParameter.java b/src/main/java/ArgsParser/ParameterTypes/BolArrParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/BolArrParameter.java rename to src/main/java/ArgsParser/ParameterTypes/BolArrParameter.java diff --git a/src/ArgsParser/ParameterTypes/BolParameter.java b/src/main/java/ArgsParser/ParameterTypes/BolParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/BolParameter.java rename to src/main/java/ArgsParser/ParameterTypes/BolParameter.java diff --git a/src/ArgsParser/ParameterTypes/ChrArrParameter.java b/src/main/java/ArgsParser/ParameterTypes/ChrArrParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/ChrArrParameter.java rename to src/main/java/ArgsParser/ParameterTypes/ChrArrParameter.java diff --git a/src/ArgsParser/ParameterTypes/ChrParameter.java b/src/main/java/ArgsParser/ParameterTypes/ChrParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/ChrParameter.java rename to src/main/java/ArgsParser/ParameterTypes/ChrParameter.java diff --git a/src/ArgsParser/ParameterTypes/DblArrParameter.java b/src/main/java/ArgsParser/ParameterTypes/DblArrParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/DblArrParameter.java rename to src/main/java/ArgsParser/ParameterTypes/DblArrParameter.java diff --git a/src/ArgsParser/ParameterTypes/DblParameter.java b/src/main/java/ArgsParser/ParameterTypes/DblParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/DblParameter.java rename to src/main/java/ArgsParser/ParameterTypes/DblParameter.java diff --git a/src/ArgsParser/ParameterTypes/FltArrParameter.java b/src/main/java/ArgsParser/ParameterTypes/FltArrParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/FltArrParameter.java rename to src/main/java/ArgsParser/ParameterTypes/FltArrParameter.java diff --git a/src/ArgsParser/ParameterTypes/FltParameter.java b/src/main/java/ArgsParser/ParameterTypes/FltParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/FltParameter.java rename to src/main/java/ArgsParser/ParameterTypes/FltParameter.java diff --git a/src/ArgsParser/ParameterTypes/IntArrParameter.java b/src/main/java/ArgsParser/ParameterTypes/IntArrParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/IntArrParameter.java rename to src/main/java/ArgsParser/ParameterTypes/IntArrParameter.java diff --git a/src/ArgsParser/ParameterTypes/IntParameter.java b/src/main/java/ArgsParser/ParameterTypes/IntParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/IntParameter.java rename to src/main/java/ArgsParser/ParameterTypes/IntParameter.java diff --git a/src/ArgsParser/ParameterTypes/PthArrParameter.java b/src/main/java/ArgsParser/ParameterTypes/PthArrParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/PthArrParameter.java rename to src/main/java/ArgsParser/ParameterTypes/PthArrParameter.java diff --git a/src/ArgsParser/ParameterTypes/PthParameter.java b/src/main/java/ArgsParser/ParameterTypes/PthParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/PthParameter.java rename to src/main/java/ArgsParser/ParameterTypes/PthParameter.java diff --git a/src/ArgsParser/ParameterTypes/StrArrParameter.java b/src/main/java/ArgsParser/ParameterTypes/StrArrParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/StrArrParameter.java rename to src/main/java/ArgsParser/ParameterTypes/StrArrParameter.java diff --git a/src/ArgsParser/ParameterTypes/StrParameter.java b/src/main/java/ArgsParser/ParameterTypes/StrParameter.java similarity index 100% rename from src/ArgsParser/ParameterTypes/StrParameter.java rename to src/main/java/ArgsParser/ParameterTypes/StrParameter.java From 962b4f82200c94b1ebf9248e42804f4b356a69af Mon Sep 17 00:00:00 2001 From: Niklas Date: Sat, 26 Apr 2025 14:22:21 +0200 Subject: [PATCH 3/5] add target to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index ed8b5f4..066f185 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,9 @@ out/ /bin/ /src/test/ReadmeExampleCode.java +### Maven ### +target/ + ### Eclipse ### .apt_generated .classpath From 895da4186058e622286c8906f2e003f4fabed592 Mon Sep 17 00:00:00 2001 From: Niklas Date: Sat, 26 Apr 2025 14:55:27 +0200 Subject: [PATCH 4/5] resolve #56 corrected the formatLastPartInLine method in CalledForHelpNotification.java --- .../java/ArgsParser/CalledForHelpNotification.java | 7 ++++--- src/test/TestArgsExceptions.java | 10 +++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/ArgsParser/CalledForHelpNotification.java b/src/main/java/ArgsParser/CalledForHelpNotification.java index 948c786..003075c 100644 --- a/src/main/java/ArgsParser/CalledForHelpNotification.java +++ b/src/main/java/ArgsParser/CalledForHelpNotification.java @@ -258,10 +258,11 @@ private static String generateInformationLine(String fullName, String shortName, private static String formatLastPartInLine(String informationLine, String lastPart) { lastPart = lastPart.trim(); int fillSpace = 15 + longestFullSize + longestShortSize + longestUsedTypeSize; - String filler = String.format(String.format("#%%%ds", fillSpace), informationLine); - if (informationLine.length() + lastPart.length() <= consoleWidth) return filler + lastPart + "\n"; + String firstPart = String.format(String.format("#%%%ds", fillSpace), informationLine); + String filler = "#" + " ".repeat(fillSpace); + if (informationLine.length() + lastPart.length() <= consoleWidth) return firstPart + lastPart + "\n"; - StringBuilder fullPart = new StringBuilder(informationLine); + StringBuilder fullPart = new StringBuilder(firstPart); int freeSpace = consoleWidth - filler.length(); while (lastPart.length() > freeSpace) { diff --git a/src/test/TestArgsExceptions.java b/src/test/TestArgsExceptions.java index 5cf33c2..f50b197 100644 --- a/src/test/TestArgsExceptions.java +++ b/src/test/TestArgsExceptions.java @@ -482,11 +482,11 @@ public void testHelpWithNewLineInDescription() { # [s]=String # (!)=mandatory | ( )=optional | (/)=command # - ## --longString -ls [s] ( ) This description is so long, it will force the automatic help - ### --longString -ls [s] ( ) printout to introduce a new line and still have a nice look :) - default: this/path/is/so/long/it/is/actually/longer/than/any/existing/path/ - # default: that/I/have/on/my/PC/Do/You/Know/The/WordOberwesedampfschifffahrts - # default: gesellschaftskapitän + ### --longString -ls [s] ( ) This description is so long, it will force the automatic help + # printout to introduce a new line and still have a nice look :) + # default: this/path/is/so/long/it/is/actually/longer/than/any/existing/path/ + # that/I/have/on/my/PC/Do/You/Know/The/WordOberwesedampfschifffahrts + # gesellschaftskapitän # #################################################################################################### """; From 296669e9aec7f32ddbcc940f8295b68fcd3672e8 Mon Sep 17 00:00:00 2001 From: Niklas Date: Sat, 26 Apr 2025 16:45:20 +0200 Subject: [PATCH 5/5] Refactor parseArguments method in ArgsParser.java, resolve #52 --- pom.xml | 2 +- src/main/java/ArgsParser/ArgsParser.java | 112 +++++++++++++++++------ 2 files changed, 86 insertions(+), 28 deletions(-) diff --git a/pom.xml b/pom.xml index 0e25f83..717b7b7 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.github.AbUndMax java_argsparser - 6.0.0 + 6.0.1 jar Java ArgsParser diff --git a/src/main/java/ArgsParser/ArgsParser.java b/src/main/java/ArgsParser/ArgsParser.java index 2c7520b..f1cfb45 100644 --- a/src/main/java/ArgsParser/ArgsParser.java +++ b/src/main/java/ArgsParser/ArgsParser.java @@ -439,11 +439,7 @@ private Set> parseArguments(String[] args) throws UnknownFlagArgsEx Set> givenParameters = new HashSet<>(); - //check if the first argument provided is actually a flag or command - if (args.length > 0 && parameterMap.get(args[0]) == null && commandMap.get(args[0]) == null && - !(args[0].equals("--help") || args[0].equals("-h"))) { - throw new UnknownFlagArgsException(args[0], parameterMap.keySet(), commandMap.keySet(), true); - } + validateInitialArg(args[0]); Parameter currentParameter = null; boolean longFlagUsed = false; @@ -463,47 +459,42 @@ private Set> parseArguments(String[] args) throws UnknownFlagArgsEx boolean lastPositionWasFlag = i >= 1 && args[i - 1].startsWith("-"); boolean flagAlreadyProvided = false; if (flagExists) flagAlreadyProvided = givenParameters.contains(currentParameter); - boolean isHelpCall = ("--help".equals(arg) || "-h".equals(arg)); - boolean helpCallInWrongPosition = isHelpCall && (i > 1 || (i == 0 && args.length == 2)); + boolean helpCallInWrongPosition = isHelpFlag(arg) && (i > 1 || (i == 0 && args.length == 2)); if (helpCallInWrongPosition) { + // --> if a -h or --help is in a not allowed position throw new HelpAtWrongPositionArgsException(); - } else if (currentPositionIsFlag && !flagExists) { // if flag is unknown + } else if (currentPositionIsFlag && !flagExists) { + // --> if flag is unknown throw new UnknownFlagArgsException(arg, parameterMap.keySet(), commandMap.keySet(), false); - } else if (currentPositionIsFlag && flagAlreadyProvided) { // if the flag already was set + } else if (currentPositionIsFlag && flagAlreadyProvided) { + // --> if the flag already was set throw new FlagAlreadyProvidedArgsException(currentParameter.getFullFlag(), currentParameter.getShortFlag()); - } else if (argumentSet && !currentPositionIsFlag && !currentPositionIsCommand) { // if two arguments are provided to a single flag + } else if (argumentSet && !currentPositionIsFlag && !currentPositionIsCommand) { + // --> if two arguments are provided to a single flag throw new TooManyArgumentsArgsException(longFlagUsed ? currentParameter.getFullFlag() : currentParameter.getShortFlag()); - } else if (currentPositionIsFlag && lastPositionWasFlag) { // if a flag follows another flag + } else if (currentPositionIsFlag && lastPositionWasFlag) { + // --> if a flag follows another flag throw new MissingArgArgsException(args[i - 1]); - } else if (isLastEntry && currentPositionIsFlag) { //if last Flag has no argument + } else if (isLastEntry && currentPositionIsFlag) { + // --> if last Flag has no argument throw new MissingArgArgsException(arg); - } else if (currentPositionIsCommand) { // if current position is a command + } else if (currentPositionIsCommand) { + // --> if current position is a command commandMap.get(arg).setCommand(); // set the command to true - } else if (lastPositionWasFlag && currentParameterNotNull) { // if the current position is an argument - - boolean isArrayParam = arrayParameters.contains(args[i - 1]); - if (isArrayParam) { // "collect" all following arguments after an array parameter in a StringBuilder - currentParameter.setArgument(args[i]); - while(i + 1 < args.length && !args[i + 1].startsWith("-") && !commandMap.containsKey(args[i + 1])) { // loop through all arguments - currentParameter.setArgument(args[++i]); - } - - } else { - currentParameter.setArgument(arg); - - } - currentParameter.setProvided(); + } else if (lastPositionWasFlag && currentParameterNotNull) { + // --> if the current position is an argument + i = handleArgument(currentParameter, args, i); givenParameters.add(currentParameter); // add parameter to the given Parameter Set } } @@ -511,6 +502,32 @@ private Set> parseArguments(String[] args) throws UnknownFlagArgsEx return givenParameters; } + /** + * Validates the very first argument: it must be either a flag, a command, or help. + * + * @param arg the first raw command-line arguments + * @throws UnknownFlagArgsException if the first token is neither flag nor command nor help + */ + private void validateInitialArg(String arg) throws UnknownFlagArgsException { + if (parameterMap.get(arg) == null + && commandMap .get(arg) == null + && !isHelpFlag(arg)) { + throw new UnknownFlagArgsException( + arg, parameterMap.keySet(), commandMap.keySet(), true + ); + } + } + + /** + * Checks whether the provided token is the help flag. + * + * @param arg the argument token to check + * @return true if {@code arg} equals "--help" or "-h" + */ + private boolean isHelpFlag(String arg) { + return "--help".equals(arg) || "-h".equals(arg); + } + /** * checks if all mandatory parameters were given in args! * @param givenParameters a set of all Parameter instances created based on args @@ -528,6 +545,47 @@ private void checkMandatoryArguments(Set> givenParameters) throws M } } + + /** + * Consumes one or more argument values for the current parameter. + * + * @param currentParameter the flag's Parameter instance + * @param args the full args array + * @param i the index of the first value in args + * @return the new index after consuming all relevant values + * @throws NotExistingPathArgsException if a path parameter points to a non-existent path + * @throws InvalidArgTypeArgsException if a invalid argument type is set to the parameter + */ + private int handleArgument(Parameter currentParameter, String[] args, int i) + throws NotExistingPathArgsException, InvalidArgTypeArgsException { + + String arg = args[i]; + boolean isArrayParam = arrayParameters.contains(args[i - 1]); + if (isArrayParam) { // if currentParameter is an array parameter + currentParameter.setArgument(arg); + // loop through all arguments and "collect" all following arguments until next flag or end + while(i + 1 < args.length && !args[i + 1].startsWith("-") && !commandMap.containsKey(args[i + 1])) { + currentParameter.setArgument(args[++i]); + } + + } else { + currentParameter.setArgument(arg); + + } + currentParameter.setProvided(); + return i; + } + + + /** + * Validates that no more than one command in each toggle group has been provided. + * The parser maintains a list of mutually exclusive command groups (toggleList), + * where only one command per group may be active. This method iterates through each + * group and counts how many commands are marked as provided. If more than one command + * in the same group is provided, a ToggleArgsException is thrown. + * + * @throws ToggleArgsException if multiple commands from the same toggle group are provided + */ private void checkToggles() throws ToggleArgsException{ for (Command[] toggle : toggleList) {