From 7c9d4a95bb36bd877e5fd967938cb6dc70297f8e Mon Sep 17 00:00:00 2001 From: Siphalor Date: Mon, 6 Oct 2025 01:19:37 +0200 Subject: [PATCH] [serde-extension] Implement support for reading/writing enums --- .../readwrite/TweedEntryReaderWriters.java | 5 +++ ...ltTweedEntryReaderWriterImplsProvider.java | 2 ++ .../impl/TweedEntryReaderWriterImpls.java | 32 +++++++++++++++++++ .../api/auto/DefaultReadWriteMappings.java | 1 + 4 files changed, 40 insertions(+) diff --git a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/readwrite/TweedEntryReaderWriters.java b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/readwrite/TweedEntryReaderWriters.java index 2132b79..404bbf4 100644 --- a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/readwrite/TweedEntryReaderWriters.java +++ b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/readwrite/TweedEntryReaderWriters.java @@ -46,6 +46,11 @@ public class TweedEntryReaderWriters { return TweedEntryReaderWriterImpls.STRING_READER_WRITER; } + public static > TweedEntryReaderWriter> enumReaderWriter() { + //noinspection unchecked,rawtypes + return (TweedEntryReaderWriter>)(TweedEntryReaderWriter) TweedEntryReaderWriterImpls.ENUM_READER_WRITER; + } + public static > TweedEntryReader nullableReader(TweedEntryReader delegate) { return new TweedEntryReaderWriterImpls.NullableReader<>(delegate); } diff --git a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/DefaultTweedEntryReaderWriterImplsProvider.java b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/DefaultTweedEntryReaderWriterImplsProvider.java index 2450f46..fc2a2fb 100644 --- a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/DefaultTweedEntryReaderWriterImplsProvider.java +++ b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/DefaultTweedEntryReaderWriterImplsProvider.java @@ -37,6 +37,8 @@ public class DefaultTweedEntryReaderWriterImplsProvider implements TweedReaderWr context.registerWriterFactory("tweed5.double", new StaticReaderWriterFactory<>(doubleReaderWriter())); context.registerReaderFactory("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.registerWriterFactory("tweed5.collection", new StaticReaderWriterFactory<>(collectionReaderWriter())); context.registerReaderFactory("tweed5.compound", new StaticReaderWriterFactory<>(compoundReaderWriter())); diff --git a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/TweedEntryReaderWriterImpls.java b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/TweedEntryReaderWriterImpls.java index 3ef5177..1477dc2 100644 --- a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/TweedEntryReaderWriterImpls.java +++ b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/TweedEntryReaderWriterImpls.java @@ -26,6 +26,7 @@ public class TweedEntryReaderWriterImpls { public static final TweedEntryReaderWriter> FLOAT_READER_WRITER = new PrimitiveReaderWriter<>(TweedDataToken::readAsFloat, TweedDataVisitor::visitFloat); public static final TweedEntryReaderWriter> DOUBLE_READER_WRITER = new PrimitiveReaderWriter<>(TweedDataToken::readAsDouble, TweedDataVisitor::visitDouble); public static final TweedEntryReaderWriter> STRING_READER_WRITER = new PrimitiveReaderWriter<>(TweedDataToken::readAsString, TweedDataVisitor::visitString); + public static final TweedEntryReaderWriter, ConfigEntry>> ENUM_READER_WRITER = new EnumReaderWriter<>(); public static final TweedEntryReaderWriter, CollectionConfigEntry>> COLLECTION_READER_WRITER = new CollectionReaderWriter<>(); public static final TweedEntryReaderWriter> COMPOUND_READER_WRITER = new CompoundReaderWriter<>(); @@ -86,6 +87,37 @@ public class TweedEntryReaderWriterImpls { } } + @RequiredArgsConstructor + public static class EnumReaderWriter> implements TweedEntryReaderWriter> { + @Override + public T read(TweedDataReader reader, ConfigEntry 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 entry, + TweedWriteContext context + ) throws TweedEntryWriteException, TweedDataWriteException { + requireNonNullWriteValue(value, context); + writer.visitString(value.name()); + } + } + public static class CollectionReaderWriter> implements TweedEntryReaderWriter> { @Override public C read(TweedDataReader reader, CollectionConfigEntry entry, TweedReadContext context) throws diff --git a/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/api/auto/DefaultReadWriteMappings.java b/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/api/auto/DefaultReadWriteMappings.java index dcdbd76..ee70650 100644 --- a/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/api/auto/DefaultReadWriteMappings.java +++ b/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/api/auto/DefaultReadWriteMappings.java @@ -19,6 +19,7 @@ import java.util.Collection; @AutoReadWriteMapping(valueClasses = {float.class, Float.class}, spec = "tweed5.float") @AutoReadWriteMapping(valueClasses = {double.class, Double.class}, spec = "tweed5.double") @AutoReadWriteMapping(valueClasses = String.class, spec = "tweed5.string") +@AutoReadWriteMapping(valueClasses = Enum.class, spec = "tweed5.enum") @AutoReadWriteMapping( entryClasses = CollectionConfigEntry.class, valueClasses = Collection.class,