001package com.mrivanplays.annotationconfig.yaml;
002
003import com.mrivanplays.annotationconfig.core.serialization.DataObject;
004import com.mrivanplays.annotationconfig.core.serialization.FieldTypeSerializer;
005import com.mrivanplays.annotationconfig.core.serialization.SerializerRegistry;
006import java.lang.reflect.Field;
007import java.util.HashMap;
008import java.util.Map;
009
010/**
011 * Represents a section object list serializer.
012 *
013 * @param <T> section object list object type
014 * @author MrIvanPlays
015 * @since v2.1.1
016 * @see SectionObjectList
017 */
018public final class SectionObjectListSerializer<T>
019    implements FieldTypeSerializer<SectionObjectList<T>> {
020
021  /** {@inheritDoc} */
022  @Override
023  public SectionObjectList<T> deserialize(DataObject data, Field field, Object annotatedConfig) {
024    try {
025      SectionObjectList<T> def = (SectionObjectList<T>) field.get(annotatedConfig);
026      Map<String, Object> map = data.getAsMap();
027      Map<String, T> deserialized = new HashMap<>();
028      for (Map.Entry<String, Object> entry : map.entrySet()) {
029        if (!(entry.getValue() instanceof Map)) {
030          throw new IllegalArgumentException("Illegal SectionObjectList inputted: " + data);
031        }
032        FieldTypeSerializer serializer =
033            SerializerRegistry.INSTANCE.getSerializer(def.getObjectsType()).orElse(null);
034        deserialized.put(
035            entry.getKey(),
036            serializer != null
037                ? (T)
038                    serializer.deserialize(new DataObject(entry.getValue()), field, annotatedConfig)
039                : (T)
040                    SerializerRegistry.INSTANCE.tryDeserialize(
041                        new DataObject(entry.getValue()),
042                        field,
043                        annotatedConfig,
044                        def.getObjectsType(),
045                        def.getObjectsType()));
046      }
047      return new SectionObjectList<>(def.getObjectsType(), deserialized);
048    } catch (IllegalAccessException e) {
049      throw new RuntimeException(e);
050    }
051  }
052
053  /** {@inheritDoc} */
054  @Override
055  public DataObject serialize(SectionObjectList<T> value, Field field) {
056    DataObject ret = new DataObject();
057    value
058        .getAsMap()
059        .forEach(
060            (k, v) -> {
061              FieldTypeSerializer serializer =
062                  SerializerRegistry.INSTANCE
063                      .getSerializer(value.getObjectsType())
064                      .orElse(SerializerRegistry.INSTANCE.getDefaultSerializer());
065              ret.putAll(k, serializer.serialize(value.getObjectsType().cast(v), field));
066            });
067    return ret;
068  }
069}