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}