From 635fb586c4641c00a9dbcd0fe024f884c9110de4 Mon Sep 17 00:00:00 2001 From: altrisi Date: Wed, 12 Oct 2022 16:13:59 +0200 Subject: [PATCH] Allow rules to declare they only accept a set of options (#1560) --- src/main/java/carpet/api/settings/CarpetRule.java | 12 ++++++++++++ .../java/carpet/api/settings/SettingsManager.java | 2 +- src/main/java/carpet/settings/ParsedRule.java | 9 +++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/carpet/api/settings/CarpetRule.java b/src/main/java/carpet/api/settings/CarpetRule.java index 90454b47..98fec623 100644 --- a/src/main/java/carpet/api/settings/CarpetRule.java +++ b/src/main/java/carpet/api/settings/CarpetRule.java @@ -85,6 +85,18 @@ public interface CarpetRule { */ T defaultValue(); + /** + *

Returns whether this rule is strict.

+ * + *

A rule being strict means that it will only accept the suggestions returned by {@link #suggestions()} as valid values.

+ * + *

Note that a rule implementation may return {@code false} in this method but still not accept options other than those + * returned in {@link #suggestions()}, only the opposite is guaranteed.

+ */ + default boolean strict() { + return false; + } + /** *

Sets this rule's value to the provided {@link String}, after first converting the {@link String} into a suitable type.

* diff --git a/src/main/java/carpet/api/settings/SettingsManager.java b/src/main/java/carpet/api/settings/SettingsManager.java index bdf3e6b0..9df0fad5 100644 --- a/src/main/java/carpet/api/settings/SettingsManager.java +++ b/src/main/java/carpet/api/settings/SettingsManager.java @@ -533,7 +533,7 @@ public class SettingsManager { ps.println("* Type: `" + rule.type().getSimpleName() + "` "); ps.println("* Default value: `" + RuleHelper.toRuleString(rule.defaultValue()) + "` "); String options = rule.suggestions().stream().map(s -> "`" + s + "`").collect(Collectors.joining(", ")); - if (!options.isEmpty()) ps.println((rule instanceof ParsedRule pr && pr.isStrict?"* Required":"* Suggested")+" options: " + options + " "); + if (!options.isEmpty()) ps.println((rule.strict() ? "* Required" : "* Suggested") + " options: " + options + " "); ps.println("* Categories: " + rule.categories().stream().map(s -> "`" + s.toUpperCase(Locale.ROOT) + "`").collect(Collectors.joining(", ")) + " "); if (rule instanceof ParsedRule) { diff --git a/src/main/java/carpet/settings/ParsedRule.java b/src/main/java/carpet/settings/ParsedRule.java index 4717e9a0..5da52f34 100644 --- a/src/main/java/carpet/settings/ParsedRule.java +++ b/src/main/java/carpet/settings/ParsedRule.java @@ -85,9 +85,9 @@ public final class ParsedRule implements CarpetRule, Comparable options; /** - * @deprecated No replacement for this + * @deprecated Use {@link CarpetRule#strict()} instead */ - @Deprecated(forRemoval = true) // to pckg private (for printRulesToLog, or get a different way) + @Deprecated(forRemoval = true) // to remove or fix public boolean isStrict; /** * @deprecated Use {@link CarpetRule#canBeToggledClientSide()} instead @@ -391,6 +391,11 @@ public final class ParsedRule implements CarpetRule, Comparable Map.Entry, FromStringConverter> numericalConverter(Class outputClass, Function converter) { return Map.entry(outputClass, str -> { try {