X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=inline;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Futil%2Fenvopt%2FParser.java;fp=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Futil%2Fenvopt%2FParser.java;h=208d6f43c0b9641794f4a8e08e8fa22606628d66;hb=addfbc56099ebd7609b79a1f9de1a6659d5441e2;hp=0000000000000000000000000000000000000000;hpb=8c6fbacda7fb8a47533b3d9c42653949527dfb0c;p=rhynodge.git
diff --git a/src/main/java/net/pterodactylus/util/envopt/Parser.java b/src/main/java/net/pterodactylus/util/envopt/Parser.java
new file mode 100644
index 0000000..208d6f4
--- /dev/null
+++ b/src/main/java/net/pterodactylus/util/envopt/Parser.java
@@ -0,0 +1,51 @@
+package net.pterodactylus.util.envopt;
+
+import java.lang.reflect.Field;
+import java.util.Optional;
+import java.util.function.Supplier;
+
+/**
+ * Parses values from an {@link Environment} into {@link Option}-annotated fields of an object.
+ *
+ * @author David âBombeâ Roden
+ */
+public class Parser {
+
+ private final Environment environment;
+
+ public Parser(Environment environment) {
+ this.environment = environment;
+ }
+
+ public T parseEnvironment(Supplier optionsObjectSupplier) {
+ T optionsObject = optionsObjectSupplier.get();
+ Class> optionsClass = optionsObject.getClass();
+ for (Field field : optionsClass.getDeclaredFields()) {
+ Option[] options = field.getAnnotationsByType(Option.class);
+ if (options.length == 0) {
+ continue;
+ }
+ for (Option option : options) {
+ String variableName = option.name();
+ Optional value = environment.getValue(variableName);
+ if (option.required() && !value.isPresent()) {
+ throw new RequiredOptionIsMissing();
+ }
+ field.setAccessible(true);
+ try {
+ field.set(optionsObject, value.orElse(null));
+ } catch (IllegalAccessException iae1) {
+ /* swallow. */
+ }
+ }
+ }
+ return optionsObject;
+ }
+
+ public static Parser fromSystemEnvironment() {
+ return new Parser(new SystemEnvironment());
+ }
+
+ public static class RequiredOptionIsMissing extends RuntimeException { }
+
+}