[serde-extension] Implement support for reading/writing enums
This commit is contained in:
@@ -46,6 +46,11 @@ public class TweedEntryReaderWriters {
|
||||
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) {
|
||||
return new TweedEntryReaderWriterImpls.NullableReader<>(delegate);
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
|
||||
@@ -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<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<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<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>> {
|
||||
@Override
|
||||
public C read(TweedDataReader reader, CollectionConfigEntry<T, C> entry, TweedReadContext context) throws
|
||||
|
||||
Reference in New Issue
Block a user