From 9e86407323f7f754187f62c8b515984da8432739 Mon Sep 17 00:00:00 2001 From: RubixDev <35602040+RubixDev@users.noreply.github.com> Date: Sun, 11 Jul 2021 02:40:21 +0200 Subject: [PATCH] Add condition argument to Rule annotation (#998) --- src/main/java/carpet/settings/Condition.java | 5 +++++ src/main/java/carpet/settings/Rule.java | 5 +++++ .../java/carpet/settings/SettingsManager.java | 19 ++++++++++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/main/java/carpet/settings/Condition.java diff --git a/src/main/java/carpet/settings/Condition.java b/src/main/java/carpet/settings/Condition.java new file mode 100644 index 00000000..198389fe --- /dev/null +++ b/src/main/java/carpet/settings/Condition.java @@ -0,0 +1,5 @@ +package carpet.settings; + +public interface Condition { + boolean isTrue(); +} diff --git a/src/main/java/carpet/settings/Rule.java b/src/main/java/carpet/settings/Rule.java index 365d4cb3..1e638645 100644 --- a/src/main/java/carpet/settings/Rule.java +++ b/src/main/java/carpet/settings/Rule.java @@ -64,4 +64,9 @@ public @interface Rule * The class of the validator checked when the rule is changed. */ Class[] validate() default {}; + + /** + * The class of the condition checked when the rule is parsed. + */ + Class[] condition() default {}; } diff --git a/src/main/java/carpet/settings/SettingsManager.java b/src/main/java/carpet/settings/SettingsManager.java index 9909ac55..9332b943 100644 --- a/src/main/java/carpet/settings/SettingsManager.java +++ b/src/main/java/carpet/settings/SettingsManager.java @@ -30,6 +30,7 @@ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.PrintStream; +import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.nio.file.Files; import java.nio.file.NoSuchFileException; @@ -143,7 +144,23 @@ public class SettingsManager Rule rule = f.getAnnotation(Rule.class); if (rule == null) continue; ParsedRule parsed = new ParsedRule(f, rule, this); - rules.put(parsed.name, parsed); + + List conditions = new ArrayList<>(); + for (Class condition : rule.condition()) { + try + { + Constructor constr = condition.getDeclaredConstructor(); + constr.setAccessible(true); + conditions.add(((Condition) constr.newInstance()).isTrue()); + } + catch (ReflectiveOperationException e) + { + throw new RuntimeException(e); + } + } + + if (rule.condition().length == 0 || conditions.stream().allMatch(Boolean::valueOf)) + rules.put(parsed.name, parsed); } }