From 65f3cc1b3dbe4a33eb4d3283e340fbf2bed01a21 Mon Sep 17 00:00:00 2001 From: carm Date: Mon, 17 Mar 2025 00:26:47 +0800 Subject: [PATCH] feat(validator): Support validators for config values. BREAKING CHANGE: `ValueManifest` and `ConfigValue` added a new type "UNIT" to mark the minimal unit value of this instance. link #132 --- .../loader/ConfigurationInitializer.java | 17 ++++++-- .../validators/StandardValidators.java | 8 ---- .../configuration/validators/Validators.java | 40 +++++++++++++++++++ 3 files changed, 53 insertions(+), 12 deletions(-) delete mode 100644 features/validators/src/main/java/cc/carm/lib/configuration/validators/StandardValidators.java create mode 100644 features/validators/src/main/java/cc/carm/lib/configuration/validators/Validators.java diff --git a/core/src/main/java/cc/carm/lib/configuration/source/loader/ConfigurationInitializer.java b/core/src/main/java/cc/carm/lib/configuration/source/loader/ConfigurationInitializer.java index 153727a..1229a2f 100644 --- a/core/src/main/java/cc/carm/lib/configuration/source/loader/ConfigurationInitializer.java +++ b/core/src/main/java/cc/carm/lib/configuration/source/loader/ConfigurationInitializer.java @@ -1,6 +1,7 @@ package cc.carm.lib.configuration.source.loader; import cc.carm.lib.configuration.Configuration; +import cc.carm.lib.configuration.function.ValueValidator; import cc.carm.lib.configuration.source.ConfigurationHolder; import cc.carm.lib.configuration.source.meta.ConfigurationMetadata; import cc.carm.lib.configuration.source.meta.StandardMeta; @@ -48,7 +49,7 @@ public class ConfigurationInitializer { return valueInitializer; } - public void fieldInitializer(@NotNull ConfigInitializeHandler> fieldInitializer) { + public void fieldInitializer(@NotNull ConfigInitializeHandler> fieldInitializer) { this.valueInitializer = fieldInitializer; } @@ -60,7 +61,7 @@ public class ConfigurationInitializer { this.classInitializer = classInitializer; } - public void appendFieldInitializer(@NotNull ConfigInitializeHandler> fieldInitializer) { + public void appendFieldInitializer(@NotNull ConfigInitializeHandler> fieldInitializer) { this.valueInitializer = this.valueInitializer.andThen(fieldInitializer); } @@ -95,6 +96,14 @@ public class ConfigurationInitializer { registerFieldAnnotation(annotation, metadata, extractor); } + public void registerValidAnnotation(@NotNull Class annotation, + @NotNull Function> builder) { + appendFieldInitializer((holder, path, field, instance) -> { + A data = field.getAnnotation(annotation); + if (data == null) return; + instance.validate((h, t) -> builder.apply(data).validate(h, t)); + }); + } public @Nullable String getFieldPath(@NotNull ConfigurationHolder holder, @Nullable String parentPath, @NotNull Field field) { return pathGenerator.getFieldPath(holder, parentPath, field); @@ -163,9 +172,9 @@ public class ConfigurationInitializer { field.setAccessible(true); Object object = field.get(source); // - if (object instanceof ConfigValue) { + if (object instanceof ConfigValue) { // 目标是 ConfigValue 实例,进行具体的初始化注入 - ConfigValue value = (ConfigValue) object; + ConfigValue value = (ConfigValue) object; String path = getFieldPath(holder, parent, field); if (path == null) return; value.initialize(holder, path); diff --git a/features/validators/src/main/java/cc/carm/lib/configuration/validators/StandardValidators.java b/features/validators/src/main/java/cc/carm/lib/configuration/validators/StandardValidators.java deleted file mode 100644 index cb029b0..0000000 --- a/features/validators/src/main/java/cc/carm/lib/configuration/validators/StandardValidators.java +++ /dev/null @@ -1,8 +0,0 @@ -package cc.carm.lib.configuration.validators; - -public class StandardValidators { - - - - -} diff --git a/features/validators/src/main/java/cc/carm/lib/configuration/validators/Validators.java b/features/validators/src/main/java/cc/carm/lib/configuration/validators/Validators.java new file mode 100644 index 0000000..c354efd --- /dev/null +++ b/features/validators/src/main/java/cc/carm/lib/configuration/validators/Validators.java @@ -0,0 +1,40 @@ +package cc.carm.lib.configuration.validators; + +import cc.carm.lib.configuration.annotation.ValuePattern; +import cc.carm.lib.configuration.annotation.ValueRange; +import cc.carm.lib.configuration.function.ValueValidator; +import cc.carm.lib.configuration.source.ConfigurationHolder; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.regex.Pattern; + +public class Validators { + + public static void initialize(ConfigurationHolder holder) { + holder.initializer().registerValidAnnotation(ValueRange.class, r -> (ho, value) -> { + if (!(value instanceof Number)) { + throw new IllegalArgumentException("Value is not a number: " + value); + } + + Number number = (Number) value; + if (number.doubleValue() < r.min() || number.doubleValue() > r.max()) { + throw new IllegalArgumentException(r.message()); + } + }); + + holder.initializer().registerValidAnnotation(ValuePattern.class, r -> new ValueValidator() { + private final Pattern pattern = Pattern.compile(r.value()); + + @Override + public void validate(@NotNull ConfigurationHolder holder, @Nullable Object value) throws Exception { + if (value == null) return; + if (!pattern.matcher(value.toString()).matches()) { + throw new IllegalArgumentException(r.message()); + } + } + }); + + } + +}