[serde-*, read-write-*] Support for visiting arbitrary decorations and values
This commit is contained in:
@@ -7,5 +7,6 @@ import org.jspecify.annotations.Nullable;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface TweedEntryWriter<T extends @Nullable Object, C extends ConfigEntry<T>> {
|
||||
void write(TweedDataVisitor writer, @Nullable T value, C entry, TweedWriteContext context) throws TweedEntryWriteException, TweedDataWriteException;
|
||||
void write(TweedDataVisitor writer, @Nullable T value, C entry, TweedWriteContext context)
|
||||
throws TweedEntryWriteException, TweedDataWriteException;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
package de.siphalor.tweed5.data.extension.api.extension;
|
||||
|
||||
import de.siphalor.tweed5.core.api.middleware.Middleware;
|
||||
import de.siphalor.tweed5.data.extension.api.TweedEntryReader;
|
||||
import de.siphalor.tweed5.data.extension.api.TweedEntryWriter;
|
||||
import de.siphalor.tweed5.patchwork.api.PatchworkPartAccess;
|
||||
|
||||
public interface ReadWriteExtensionSetupContext {
|
||||
<E> PatchworkPartAccess<E> registerReadWriteContextExtensionData(Class<E> extensionDataClass);
|
||||
void registerReaderMiddleware(Middleware<TweedEntryReader<?, ?>> middleware);
|
||||
void registerWriterMiddleware(Middleware<TweedEntryWriter<?, ?>> middleware);
|
||||
}
|
||||
|
||||
@@ -1,22 +1,6 @@
|
||||
package de.siphalor.tweed5.data.extension.api.extension;
|
||||
|
||||
import de.siphalor.tweed5.core.api.middleware.Middleware;
|
||||
import de.siphalor.tweed5.data.extension.api.TweedEntryReader;
|
||||
import de.siphalor.tweed5.data.extension.api.TweedEntryWriter;
|
||||
import org.jspecify.annotations.Nullable;
|
||||
|
||||
public interface ReadWriteRelatedExtension {
|
||||
default void setupReadWriteExtension(ReadWriteExtensionSetupContext context) {
|
||||
|
||||
}
|
||||
|
||||
@Nullable
|
||||
default Middleware<TweedEntryReader<?, ?>> entryReaderMiddleware() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
default Middleware<TweedEntryWriter<?, ?>> entryWriterMiddleware() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import de.siphalor.tweed5.core.api.entry.ConfigEntry;
|
||||
import de.siphalor.tweed5.core.api.extension.TweedExtension;
|
||||
import de.siphalor.tweed5.core.api.extension.TweedExtensionSetupContext;
|
||||
import de.siphalor.tweed5.core.api.middleware.DefaultMiddlewareContainer;
|
||||
import de.siphalor.tweed5.core.api.middleware.Middleware;
|
||||
import de.siphalor.tweed5.data.extension.api.*;
|
||||
import de.siphalor.tweed5.data.extension.api.extension.ReadWriteExtensionSetupContext;
|
||||
import de.siphalor.tweed5.data.extension.api.extension.ReadWriteRelatedExtension;
|
||||
@@ -16,7 +17,6 @@ import de.siphalor.tweed5.patchwork.api.Patchwork;
|
||||
import de.siphalor.tweed5.patchwork.api.PatchworkFactory;
|
||||
import de.siphalor.tweed5.patchwork.api.PatchworkPartAccess;
|
||||
import lombok.Data;
|
||||
import lombok.val;
|
||||
import org.jspecify.annotations.Nullable;
|
||||
|
||||
import java.util.Collection;
|
||||
@@ -48,25 +48,29 @@ public class ReadWriteExtensionImpl implements ReadWriteExtension {
|
||||
Collection<TweedExtension> extensions = configContainer.extensions();
|
||||
|
||||
PatchworkFactory.Builder readWriteContextPatchworkFactorBuilder = PatchworkFactory.builder();
|
||||
ReadWriteExtensionSetupContext setupContext = readWriteContextPatchworkFactorBuilder::registerPart;
|
||||
|
||||
entryReaderMiddlewareContainer = new DefaultMiddlewareContainer<>();
|
||||
entryWriterMiddlewareContainer = new DefaultMiddlewareContainer<>();
|
||||
|
||||
ReadWriteExtensionSetupContext setupContext = new ReadWriteExtensionSetupContext() {
|
||||
@Override
|
||||
public <E> PatchworkPartAccess<E> registerReadWriteContextExtensionData(Class<E> extensionDataClass) {
|
||||
return readWriteContextPatchworkFactorBuilder.registerPart(extensionDataClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerReaderMiddleware(Middleware<TweedEntryReader<?, ?>> middleware) {
|
||||
entryReaderMiddlewareContainer.register(middleware);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerWriterMiddleware(Middleware<TweedEntryWriter<?, ?>> middleware) {
|
||||
entryWriterMiddlewareContainer.register(middleware);
|
||||
}
|
||||
};
|
||||
|
||||
for (TweedExtension extension : extensions) {
|
||||
if (extension instanceof ReadWriteRelatedExtension) {
|
||||
ReadWriteRelatedExtension rwExtension = (ReadWriteRelatedExtension) extension;
|
||||
|
||||
rwExtension.setupReadWriteExtension(setupContext);
|
||||
|
||||
val readerMiddleware = rwExtension.entryReaderMiddleware();
|
||||
if (readerMiddleware != null) {
|
||||
entryReaderMiddlewareContainer.register(readerMiddleware);
|
||||
}
|
||||
val writerMiddleware = rwExtension.entryWriterMiddleware();
|
||||
if (writerMiddleware != null) {
|
||||
entryWriterMiddlewareContainer.register(writerMiddleware);
|
||||
}
|
||||
((ReadWriteRelatedExtension) extension).setupReadWriteExtension(setupContext);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user