Skip to content

Commit 4ab5006

Browse files
committed
argument parsing utilities
1 parent b041c72 commit 4ab5006

2 files changed

Lines changed: 128 additions & 0 deletions

File tree

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package util.argparse;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
public class ArgParser {
9+
private final Map<String, Argument> arguments;
10+
11+
public ArgParser(Argument... args) {
12+
arguments = new HashMap<>();
13+
14+
for (Argument arg : args) {
15+
String argumentName;
16+
17+
if (arg.name.length() == 1) {
18+
argumentName = "-";
19+
} else {
20+
argumentName = "--";
21+
}
22+
23+
argumentName += arg.name;
24+
25+
if (arguments.containsKey(argumentName)) {
26+
throw new IllegalArgumentException("Duplicate argument specification: Argument \"" + argumentName + "\" already exists!");
27+
} else {
28+
arguments.put(argumentName, arg);
29+
}
30+
}
31+
}
32+
33+
public void parse(String[] args) {
34+
Argument currentArgument = null;
35+
List<Argument> handledArgs = new ArrayList<>();
36+
List<String> handledStrargs = new ArrayList<>();
37+
38+
for (String strarg : args) {
39+
if (strarg.startsWith("-")) {
40+
Argument arg = arguments.get(strarg);
41+
42+
if (arg != null) {
43+
if (handledStrargs.contains(strarg)) {
44+
throw new IllegalArgumentException("Duplicate specification of rgument \"" + strarg + "\"!");
45+
}
46+
47+
currentArgument = arg;
48+
handledStrargs.add(strarg);
49+
handledArgs.add(currentArgument);
50+
51+
if (currentArgument.definedCallback != null) {
52+
currentArgument.definedCallback.accept(null);
53+
}
54+
} else {
55+
StringBuilder errorMsg = new StringBuilder("Unknown argument \"" + strarg + "\" given!\nAvailable arguments are:");
56+
57+
for (Map.Entry<String, Argument> availableArg : arguments.entrySet()) {
58+
errorMsg.append("\n").append(availableArg.getKey());
59+
}
60+
61+
throw new IllegalArgumentException(errorMsg.toString());
62+
}
63+
} else {
64+
if (currentArgument != null && currentArgument.parameterCallback != null) {
65+
currentArgument.parameterCallback.accept(strarg);
66+
} else {
67+
throw new IllegalArgumentException("Unknown parameter \"" + strarg + "\" given! An argument (beginning with \"-\" or \"--\") has to be specified first");
68+
}
69+
}
70+
}
71+
72+
for (Map.Entry<String, Argument> kv : this.arguments.entrySet()) {
73+
Argument arg = kv.getValue();
74+
if (arg.mandatory && !handledArgs.contains(arg)) {
75+
throw new IllegalArgumentException("Argument \"" + arg.name + "\" is mandatory but not specified!");
76+
}
77+
}
78+
}
79+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package util.argparse;
2+
3+
import java.util.function.Consumer;
4+
5+
public class Argument {
6+
public final static int Flag = 0;
7+
public final static int AnyNumberOfParameters = -1;
8+
public final static boolean IsOptional = false;
9+
public final static boolean IsMandatory = true;
10+
11+
protected boolean mandatory;
12+
protected String name;
13+
protected int len;
14+
protected Consumer<Void> definedCallback;
15+
protected Consumer<String> parameterCallback;
16+
17+
/**
18+
*
19+
* @param name
20+
* @param len Number of additional parameters (0: Argument is a plain flag; -1: arbitrary number of parameters)
21+
*/
22+
public Argument(String name, int len, boolean isMandatory, Consumer<Void> ifDefined, Consumer<String> parameterCallback) {
23+
if (name == null || name.isEmpty()) {
24+
throw new IllegalArgumentException("name can neither be null nor empty! was: " + name);
25+
}
26+
27+
if (name.length() == 1 && len != 0) {
28+
throw new IllegalArgumentException("Flags cannot have parameters! Flag \"" + name + "\" has " + len + " parameters but should have 0!");
29+
}
30+
31+
this.name = name;
32+
this.len = len;
33+
this.mandatory = isMandatory;
34+
this.definedCallback = ifDefined;
35+
this.parameterCallback = parameterCallback;
36+
}
37+
38+
public static Argument WithParameters(String name, int numParameters, boolean isMandatory, Consumer<Void> ifDefined, Consumer<String> parameterCallback) {
39+
return new Argument(name, numParameters, isMandatory, ifDefined, parameterCallback);
40+
}
41+
42+
public static Argument WithAnyNumberOfParameters(String name, boolean isMandatory, Consumer<Void> ifDefined, Consumer<String> parameterCallback) {
43+
return new Argument(name, AnyNumberOfParameters, isMandatory, ifDefined, parameterCallback);
44+
}
45+
46+
public static Argument Flag(char flag, Consumer<Void> ifDefined) {
47+
return new Argument("" + flag, Flag, IsOptional, ifDefined, null);
48+
}
49+
}

0 commit comments

Comments
 (0)