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); } }