[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;
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()));
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user