[serde-extension] Implement support for reading/writing enums

This commit is contained in:
2025-10-06 01:19:37 +02:00
parent 4c6f131338
commit 7c9d4a95bb
4 changed files with 40 additions and 0 deletions

View File

@@ -46,6 +46,11 @@ public class TweedEntryReaderWriters {
return TweedEntryReaderWriterImpls.STRING_READER_WRITER; return TweedEntryReaderWriterImpls.STRING_READER_WRITER;
} }
public static <T extends Enum<T>> TweedEntryReaderWriter<T, ConfigEntry<T>> enumReaderWriter() {
//noinspection unchecked,rawtypes
return (TweedEntryReaderWriter<T, @NonNull ConfigEntry<T>>)(TweedEntryReaderWriter) TweedEntryReaderWriterImpls.ENUM_READER_WRITER;
}
public static <T, C extends ConfigEntry<T>> TweedEntryReader<T, C> nullableReader(TweedEntryReader<T, C> delegate) { public static <T, C extends ConfigEntry<T>> TweedEntryReader<T, C> nullableReader(TweedEntryReader<T, C> delegate) {
return new TweedEntryReaderWriterImpls.NullableReader<>(delegate); return new TweedEntryReaderWriterImpls.NullableReader<>(delegate);
} }

View File

@@ -37,6 +37,8 @@ public class DefaultTweedEntryReaderWriterImplsProvider implements TweedReaderWr
context.registerWriterFactory("tweed5.double", new StaticReaderWriterFactory<>(doubleReaderWriter())); context.registerWriterFactory("tweed5.double", new StaticReaderWriterFactory<>(doubleReaderWriter()));
context.registerReaderFactory("tweed5.string", new StaticReaderWriterFactory<>(stringReaderWriter())); context.registerReaderFactory("tweed5.string", new StaticReaderWriterFactory<>(stringReaderWriter()));
context.registerWriterFactory("tweed5.string", new StaticReaderWriterFactory<>(stringReaderWriter())); context.registerWriterFactory("tweed5.string", new StaticReaderWriterFactory<>(stringReaderWriter()));
context.registerReaderFactory("tweed5.enum", new StaticReaderWriterFactory<>(enumReaderWriter()));
context.registerWriterFactory("tweed5.enum", new StaticReaderWriterFactory<>(enumReaderWriter()));
context.registerReaderFactory("tweed5.collection", new StaticReaderWriterFactory<>(collectionReaderWriter())); context.registerReaderFactory("tweed5.collection", new StaticReaderWriterFactory<>(collectionReaderWriter()));
context.registerWriterFactory("tweed5.collection", new StaticReaderWriterFactory<>(collectionReaderWriter())); context.registerWriterFactory("tweed5.collection", new StaticReaderWriterFactory<>(collectionReaderWriter()));
context.registerReaderFactory("tweed5.compound", new StaticReaderWriterFactory<>(compoundReaderWriter())); context.registerReaderFactory("tweed5.compound", new StaticReaderWriterFactory<>(compoundReaderWriter()));

View File

@@ -26,6 +26,7 @@ public class TweedEntryReaderWriterImpls {
public static final TweedEntryReaderWriter<Float, ConfigEntry<Float>> FLOAT_READER_WRITER = new PrimitiveReaderWriter<>(TweedDataToken::readAsFloat, TweedDataVisitor::visitFloat); public static final TweedEntryReaderWriter<Float, ConfigEntry<Float>> FLOAT_READER_WRITER = new PrimitiveReaderWriter<>(TweedDataToken::readAsFloat, TweedDataVisitor::visitFloat);
public static final TweedEntryReaderWriter<Double, ConfigEntry<Double>> DOUBLE_READER_WRITER = new PrimitiveReaderWriter<>(TweedDataToken::readAsDouble, TweedDataVisitor::visitDouble); public static final TweedEntryReaderWriter<Double, ConfigEntry<Double>> DOUBLE_READER_WRITER = new PrimitiveReaderWriter<>(TweedDataToken::readAsDouble, TweedDataVisitor::visitDouble);
public static final TweedEntryReaderWriter<String, ConfigEntry<String>> STRING_READER_WRITER = new PrimitiveReaderWriter<>(TweedDataToken::readAsString, TweedDataVisitor::visitString); public static final TweedEntryReaderWriter<String, ConfigEntry<String>> STRING_READER_WRITER = new PrimitiveReaderWriter<>(TweedDataToken::readAsString, TweedDataVisitor::visitString);
public static final TweedEntryReaderWriter<Enum<?>, ConfigEntry<Enum<?>>> ENUM_READER_WRITER = new EnumReaderWriter<>();
public static final TweedEntryReaderWriter<Collection<Object>, CollectionConfigEntry<Object, Collection<Object>>> COLLECTION_READER_WRITER = new CollectionReaderWriter<>(); public static final TweedEntryReaderWriter<Collection<Object>, CollectionConfigEntry<Object, Collection<Object>>> COLLECTION_READER_WRITER = new CollectionReaderWriter<>();
public static final TweedEntryReaderWriter<Object, CompoundConfigEntry<Object>> COMPOUND_READER_WRITER = new CompoundReaderWriter<>(); public static final TweedEntryReaderWriter<Object, CompoundConfigEntry<Object>> COMPOUND_READER_WRITER = new CompoundReaderWriter<>();
@@ -86,6 +87,37 @@ public class TweedEntryReaderWriterImpls {
} }
} }
@RequiredArgsConstructor
public static class EnumReaderWriter<T extends Enum<?>> implements TweedEntryReaderWriter<T, ConfigEntry<T>> {
@Override
public T read(TweedDataReader reader, ConfigEntry<T> entry, TweedReadContext context) throws
TweedEntryReadException {
try {
TweedDataToken token = reader.readToken();
assertIsToken(token, TweedDataToken::canReadAsString, "Expected string", context);
//noinspection unchecked,rawtypes
return (T) Enum.valueOf(((Class) entry.valueClass()), token.readAsString());
} catch (TweedDataReadException | IllegalArgumentException e) {
throw new TweedEntryReadException(
"Failed reading enum value for " + entry.valueClass().getName(),
e,
context
);
}
}
@Override
public void write(
TweedDataVisitor writer,
@Nullable T value,
ConfigEntry<T> entry,
TweedWriteContext context
) throws TweedEntryWriteException, TweedDataWriteException {
requireNonNullWriteValue(value, context);
writer.visitString(value.name());
}
}
public static class CollectionReaderWriter<T extends @Nullable Object, C extends Collection<T>> implements TweedEntryReaderWriter<C, CollectionConfigEntry<T, C>> { public static class CollectionReaderWriter<T extends @Nullable Object, C extends Collection<T>> implements TweedEntryReaderWriter<C, CollectionConfigEntry<T, C>> {
@Override @Override
public C read(TweedDataReader reader, CollectionConfigEntry<T, C> entry, TweedReadContext context) throws public C read(TweedDataReader reader, CollectionConfigEntry<T, C> entry, TweedReadContext context) throws

View File

@@ -19,6 +19,7 @@ import java.util.Collection;
@AutoReadWriteMapping(valueClasses = {float.class, Float.class}, spec = "tweed5.float") @AutoReadWriteMapping(valueClasses = {float.class, Float.class}, spec = "tweed5.float")
@AutoReadWriteMapping(valueClasses = {double.class, Double.class}, spec = "tweed5.double") @AutoReadWriteMapping(valueClasses = {double.class, Double.class}, spec = "tweed5.double")
@AutoReadWriteMapping(valueClasses = String.class, spec = "tweed5.string") @AutoReadWriteMapping(valueClasses = String.class, spec = "tweed5.string")
@AutoReadWriteMapping(valueClasses = Enum.class, spec = "tweed5.enum")
@AutoReadWriteMapping( @AutoReadWriteMapping(
entryClasses = CollectionConfigEntry.class, entryClasses = CollectionConfigEntry.class,
valueClasses = Collection.class, valueClasses = Collection.class,