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 { } + +}