|
@@ -1,6 +1,8 @@
|
|
|
package me.lortseam.completeconfig.data.entry;
|
|
|
|
|
|
import lombok.AccessLevel;
|
|
|
+import lombok.NoArgsConstructor;
|
|
|
+import lombok.NonNull;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import me.lortseam.completeconfig.api.ConfigContainer;
|
|
|
import me.lortseam.completeconfig.data.Entry;
|
|
@@ -11,44 +13,38 @@ import org.apache.commons.lang3.ArrayUtils;
|
|
|
import java.lang.annotation.Annotation;
|
|
|
import java.lang.reflect.Field;
|
|
|
import java.lang.reflect.Type;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.function.Consumer;
|
|
|
import java.util.function.Predicate;
|
|
|
|
|
|
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
|
|
-public final class Transformation<O extends EntryOrigin> {
|
|
|
+public final class Transformation {
|
|
|
|
|
|
- public static Transformation.Builder<EntryOrigin> by(Predicate<EntryBase<?>> predicate) {
|
|
|
- return new Transformation.Builder<>(EntryOrigin::new).and(predicate);
|
|
|
- }
|
|
|
-
|
|
|
- public static Transformation.Builder<EntryOrigin> byType(Type... types) {
|
|
|
- return new Transformation.Builder<>(EntryOrigin::new).andType(types);
|
|
|
- }
|
|
|
+ private static final Set<Class<Annotation>> registeredAnnotations = new HashSet<>();
|
|
|
|
|
|
- public static <A extends Annotation> Transformation.Builder<AnnotatedEntryOrigin<A>> byAnnotation(Class<A> annotationType) {
|
|
|
- return new Transformation.Builder<>((field, parentObject, parentTranslation) -> {
|
|
|
- return new AnnotatedEntryOrigin<>(field, parentObject, parentTranslation, annotationType);
|
|
|
- }).and(base -> base.getField().isAnnotationPresent(annotationType));
|
|
|
+ public static Transformation.Builder builder() {
|
|
|
+ return new Transformation.Builder();
|
|
|
}
|
|
|
|
|
|
- private final Predicate<EntryBase<?>> predicate;
|
|
|
- private final OriginCreator<O> originCreator;
|
|
|
- private final Transformer<O> transformer;
|
|
|
+ private final Predicate<Entry.Draft<?>> predicate;
|
|
|
+ private final Transformer transformer;
|
|
|
|
|
|
- public boolean test(EntryBase<?> base) {
|
|
|
+ public boolean test(Entry.Draft<?> base) {
|
|
|
return predicate.test(base);
|
|
|
}
|
|
|
|
|
|
- public Entry<?> transform(EntryBase<?> base, ConfigContainer parentObject, TranslationIdentifier parentTranslation) {
|
|
|
- return transformer.transform(originCreator.create(base.getField(), parentObject, parentTranslation));
|
|
|
+ public Entry<?> transform(Entry.Draft<?> draft, ConfigContainer parentObject, TranslationIdentifier parentTranslation) {
|
|
|
+ return transformer.transform(originCreator.create(draft.getField(), parentObject, parentTranslation));
|
|
|
}
|
|
|
|
|
|
- @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
|
|
- public static class Builder<O extends EntryOrigin> {
|
|
|
+ @NoArgsConstructor(access = AccessLevel.PRIVATE)
|
|
|
+ public static class Builder {
|
|
|
|
|
|
- private final OriginCreator<O> originCreator;
|
|
|
- private Predicate<EntryBase<?>> predicate;
|
|
|
+ private Predicate<Entry.Draft<?>> predicate;
|
|
|
|
|
|
- public Builder<O> and(Predicate<EntryBase<?>> predicate) {
|
|
|
+ private Builder by(Predicate<Entry.Draft<?>> predicate) {
|
|
|
if (this.predicate == null) {
|
|
|
this.predicate = predicate;
|
|
|
} else {
|
|
@@ -57,15 +53,32 @@ public final class Transformation<O extends EntryOrigin> {
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
- public Builder<O> andType(Type... types) {
|
|
|
- if (types.length == 0) {
|
|
|
- throw new IllegalArgumentException("Types must not be empty");
|
|
|
- }
|
|
|
- return and(base -> ArrayUtils.contains(types, base.getType()));
|
|
|
+ public Builder byType(Type... types) {
|
|
|
+ return byType(type -> ArrayUtils.contains(types, type));
|
|
|
+ }
|
|
|
+
|
|
|
+ public Builder byTypeClass(Predicate<Class<?>> typeClassPredicate) {
|
|
|
+ return by(draft -> typeClassPredicate.test(draft.getTypeClass()));
|
|
|
+ }
|
|
|
+
|
|
|
+ public Builder byType(Predicate<Type> typePredicate) {
|
|
|
+ return by(draft -> typePredicate.test(draft.getType()));
|
|
|
+ }
|
|
|
+
|
|
|
+ public Builder byAnnotation(Class<Annotation>... annotations) {
|
|
|
+ registeredAnnotations.addAll(Arrays.asList(annotations));
|
|
|
+ return by(draft -> {
|
|
|
+ for (Class<Annotation> annotationType : annotations) {
|
|
|
+ if (!draft.getField().isAnnotationPresent(annotationType)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
- public Transformation<O> transforms(Transformer<O> transformer) {
|
|
|
- return new Transformation<>(predicate, originCreator, transformer);
|
|
|
+ public Transformation transforms(Transformer transformer) {
|
|
|
+ return new Transformation(predicate, transformer);
|
|
|
}
|
|
|
|
|
|
}
|