refactor!(serde-extension): Replace reader/writer chain APIs with readSubEntry and writeSubEntry methods

This commit is contained in:
2026-04-12 21:06:46 +02:00
parent a413fab8d5
commit 2f4011c144
8 changed files with 62 additions and 31 deletions

View File

@@ -10,7 +10,7 @@ java-test = "21"
jetbrains-annotations = "26.0.1"
jspecify = "1.0.0"
junit = "5.12.0"
lombok = "1.18.38"
lombok = "1.18.44"
logback = "1.5.18"
mockito = "5.14.2"
shadow = "9.3.0"

View File

@@ -324,6 +324,14 @@ public class TweedCoatMappersImpl {
public Patchwork extensionsData() {
return readExtData;
}
@Override
public <T, C extends ConfigEntry<T>> TweedReadResult<T> readSubEntry(
TweedDataReader reader,
C entry
) {
return TweedReadResult.empty();
}
}
);
}

View File

@@ -126,6 +126,4 @@ public interface ReadWriteExtension extends TweedExtension {
Patchwork contextExtensionsData
) throws TweedEntryWriteException;
<T, C extends ConfigEntry<T>> TweedEntryReader<T, C> getReaderChain(C entry);
<T, C extends ConfigEntry<T>> TweedEntryWriter<T, C> getWriterChain(C entry);
}

View File

@@ -1,8 +1,16 @@
package de.siphalor.tweed5.serde.extension.api;
import de.siphalor.tweed5.core.api.entry.ConfigEntry;
import de.siphalor.tweed5.patchwork.api.Patchwork;
import de.siphalor.tweed5.serde.extension.api.read.result.TweedReadResult;
import de.siphalor.tweed5.serde_api.api.TweedDataReader;
import org.jspecify.annotations.Nullable;
public interface TweedReadContext {
ReadWriteExtension readWriteExtension();
Patchwork extensionsData();
<T extends @Nullable Object, C extends ConfigEntry<T>> TweedReadResult<T> readSubEntry(
TweedDataReader reader, C entry
);
}

View File

@@ -1,8 +1,15 @@
package de.siphalor.tweed5.serde.extension.api;
import de.siphalor.tweed5.core.api.entry.ConfigEntry;
import de.siphalor.tweed5.patchwork.api.Patchwork;
import de.siphalor.tweed5.serde_api.api.TweedDataVisitor;
import de.siphalor.tweed5.serde_api.api.TweedDataWriteException;
import org.jspecify.annotations.Nullable;
public interface TweedWriteContext {
ReadWriteExtension readWriteExtension();
Patchwork extensionsData();
<T extends @Nullable Object, C extends ConfigEntry<T>> void writeSubEntry(
TweedDataVisitor writer, @Nullable T value, C entry
) throws TweedEntryWriteException, TweedDataWriteException;
}

View File

@@ -179,14 +179,12 @@ public class ReadWriteExtensionImpl implements ReadWriteExtension {
private TweedEntryWriter<?, ?> writerChain;
}
@Override
public <T, C extends ConfigEntry<T>> TweedEntryReader<T, C> getReaderChain(C entry) {
<T, C extends ConfigEntry<T>> TweedEntryReader<T, C> getReaderChain(C entry) {
//noinspection unchecked
return (TweedEntryReader<T, C>) entry.extensionsData().get(customEntryDataAccess).readerChain();
}
@Override
public <T, C extends ConfigEntry<T>> TweedEntryWriter<T, C> getWriterChain(C entry) {
<T, C extends ConfigEntry<T>> TweedEntryWriter<T, C> getWriterChain(C entry) {
//noinspection unchecked
return (TweedEntryWriter<T, C>) entry.extensionsData().get(customEntryDataAccess).writerChain();
}

View File

@@ -13,7 +13,6 @@ import de.siphalor.tweed5.serde_api.api.*;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.jetbrains.annotations.Contract;
import org.jspecify.annotations.Nullable;
@@ -51,8 +50,7 @@ public class TweedEntryReaderWriterImpls {
return TweedReadResult.failed(TweedReadIssue.error(e, context));
}
TweedEntryReader<T, ConfigEntry<T>> nonNullReader = context.readWriteExtension().getReaderChain(entry.nonNullEntry());
return nonNullReader.read(reader, entry.nonNullEntry(), context);
return context.readSubEntry(reader, entry.nonNullEntry());
}
@Override
@@ -65,8 +63,7 @@ public class TweedEntryReaderWriterImpls {
if (value == null) {
writer.visitNull();
} else {
TweedEntryWriter<T, ConfigEntry<T>> nonNullWriter = context.readWriteExtension().getWriterChain(entry.nonNullEntry());
nonNullWriter.write(writer, value, entry.nonNullEntry(), context);
context.writeSubEntry(writer, value, entry.nonNullEntry());
}
}
}
@@ -161,8 +158,6 @@ public class TweedEntryReaderWriterImpls {
}
ConfigEntry<T> elementEntry = entry.elementEntry();
TweedEntryReader<T, ConfigEntry<T>> elementReader = context.readWriteExtension().getReaderChain(elementEntry);
List<T> list = new ArrayList<>(20);
List<TweedReadIssue> issues = new ArrayList<>();
while (true) {
@@ -172,7 +167,7 @@ public class TweedEntryReaderWriterImpls {
reader.readToken();
break;
} else if (token.isListValue()) {
TweedReadResult<T> elementResult = elementReader.read(reader, elementEntry, context);
TweedReadResult<T> elementResult = context.readSubEntry(reader, elementEntry);
issues.addAll(Arrays.asList(elementResult.issues()));
if (elementResult.isFailed() || elementResult.isError()) {
return TweedReadResult.failed(issues.toArray(new TweedReadIssue[0]));
@@ -207,11 +202,10 @@ public class TweedEntryReaderWriterImpls {
}
ConfigEntry<T> elementEntry = entry.elementEntry();
TweedEntryWriter<T, ConfigEntry<T>> elementWriter = context.readWriteExtension().getWriterChain(elementEntry);
writer.visitListStart();
for (T element : value) {
elementWriter.write(writer, element, elementEntry, context);
context.writeSubEntry(writer, element, elementEntry);
}
writer.visitListEnd();
}
@@ -242,8 +236,7 @@ public class TweedEntryReaderWriterImpls {
}
continue;
}
val subEntryReaderChain = context.readWriteExtension().getReaderChain(subEntry);
TweedReadResult<Object> subEntryResult = subEntryReaderChain.read(reader, subEntry, context);
TweedReadResult<Object> subEntryResult = context.readSubEntry(reader, subEntry);
issues.addAll(Arrays.asList(subEntryResult.issues()));
if (subEntryResult.isFailed() || subEntryResult.isError()) {
return TweedReadResult.failed(issues.toArray(new TweedReadIssue[0]));
@@ -281,10 +274,8 @@ public class TweedEntryReaderWriterImpls {
String key = e.getKey();
ConfigEntry<Object> subEntry = e.getValue();
TweedEntryWriter<Object, ConfigEntry<Object>> subEntryWriterChain = context.readWriteExtension().getWriterChain(subEntry);
writer.visitMapEntryKey(key);
subEntryWriterChain.write(writer, entry.get(value, key), subEntry, context);
context.writeSubEntry(writer, entry.get(value, key), subEntry);
}
writer.visitMapEnd();

View File

@@ -1,13 +1,34 @@
package de.siphalor.tweed5.serde.extension.impl;
import de.siphalor.tweed5.serde.extension.api.ReadWriteExtension;
import de.siphalor.tweed5.serde.extension.api.TweedReadContext;
import de.siphalor.tweed5.serde.extension.api.TweedWriteContext;
import de.siphalor.tweed5.core.api.entry.ConfigEntry;
import de.siphalor.tweed5.serde.extension.api.*;
import de.siphalor.tweed5.serde.extension.api.read.result.TweedReadResult;
import de.siphalor.tweed5.patchwork.api.Patchwork;
import lombok.Value;
import de.siphalor.tweed5.serde_api.api.TweedDataReader;
import de.siphalor.tweed5.serde_api.api.TweedDataVisitor;
import de.siphalor.tweed5.serde_api.api.TweedDataWriteException;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.jspecify.annotations.Nullable;
@Value
public class TweedReadWriteContextImpl implements TweedReadContext, TweedWriteContext {
ReadWriteExtension readWriteExtension;
Patchwork extensionsData;
@RequiredArgsConstructor
class TweedReadWriteContextImpl implements TweedReadContext, TweedWriteContext {
@Getter
private final ReadWriteExtensionImpl readWriteExtension;
@Getter
private final Patchwork extensionsData;
@Override
public <T extends @Nullable Object, C extends ConfigEntry<T>> TweedReadResult<T> readSubEntry(
TweedDataReader reader, C entry
) {
return readWriteExtension.getReaderChain(entry).read(reader, entry, this);
}
@Override
public <T extends @Nullable Object, C extends ConfigEntry<T>> void writeSubEntry(
TweedDataVisitor writer, @Nullable T value, C entry
) throws TweedEntryWriteException, TweedDataWriteException {
readWriteExtension.getWriterChain(entry).write(writer, value, entry, this);
}
}