package pluginbase.config.serializers;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import pluginbase.config.SerializableConfig;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class ArraySerializer implements Serializer {
@Nullable
@Override
public Object serialize(@Nullable Object object, @NotNull SerializerSet serializerSet) throws IllegalArgumentException {
if (object == null) {
return null;
}
if (object instanceof int[]) {
int[] array = (int[]) object;
List list = new ArrayList<>(array.length);
for (int i = 0; i < array.length; i++) {
list.add(i, SerializableConfig.serialize(array[i], serializerSet));
}
return list;
} else if (object instanceof long[]) {
long[] array = (long[]) object;
List list = new ArrayList<>(array.length);
for (int i = 0; i < array.length; i++) {
list.add(i, SerializableConfig.serialize(array[i], serializerSet));
}
return list;
} else if (object instanceof double[]) {
double[] array = (double[]) object;
List list = new ArrayList<>(array.length);
for (int i = 0; i < array.length; i++) {
list.add(i, SerializableConfig.serialize(array[i], serializerSet));
}
return list;
} else if (object instanceof float[]) {
float[] array = (float[]) object;
List list = new ArrayList<>(array.length);
for (int i = 0; i < array.length; i++) {
list.add(i, SerializableConfig.serialize(array[i], serializerSet));
}
return list;
} else if (object instanceof short[]) {
short[] array = (short[]) object;
List list = new ArrayList<>(array.length);
for (int i = 0; i < array.length; i++) {
list.add(i, SerializableConfig.serialize(array[i], serializerSet));
}
return list;
} else if (object instanceof byte[]) {
byte[] array = (byte[]) object;
List list = new ArrayList<>(array.length);
for (int i = 0; i < array.length; i++) {
list.add(i, SerializableConfig.serialize(array[i], serializerSet));
}
return list;
} else if (object instanceof boolean[]) {
boolean[] array = (boolean[]) object;
List list = new ArrayList<>(array.length);
for (int i = 0; i < array.length; i++) {
list.add(i, SerializableConfig.serialize(array[i], serializerSet));
}
return list;
} else if (object instanceof Object[]) {
Object[] array = (Object[]) object;
List list = new ArrayList<>(array.length);
for (int i = 0; i < array.length; i++) {
list.add(i, SerializableConfig.serialize(array[i], serializerSet));
}
return list;
} else {
throw new IllegalArgumentException("Object is not an array");
}
}
@Nullable
@Override
public Object deserialize(@Nullable Object serialized, @NotNull Class wantedType, @NotNull SerializerSet serializerSet) throws IllegalArgumentException {
if (serialized == null) {
return null;
}
if (!(serialized instanceof List)) {
throw new IllegalArgumentException("Serialized value must be a list to be deserialized as an array");
}
if (!wantedType.isArray()) {
throw new IllegalArgumentException("Wanted type must be an array to use array deserialization");
}
List list = (List) serialized;
if (wantedType.equals(int[].class)) {
int[] array = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = SerializableConfig.deserializeAs(list.get(i), int.class, serializerSet);
}
return array;
} else if (wantedType.equals(long[].class)) {
long[] array = new long[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = SerializableConfig.deserializeAs(list.get(i), long.class, serializerSet);
}
return array;
} else if (wantedType.equals(double[].class)) {
double[] array = new double[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = SerializableConfig.deserializeAs(list.get(i), double.class, serializerSet);
}
return array;
} else if (wantedType.equals(float[].class)) {
float[] array = new float[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = SerializableConfig.deserializeAs(list.get(i), float.class, serializerSet);
}
return array;
} else if (wantedType.equals(short[].class)) {
short[] array = new short[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = SerializableConfig.deserializeAs(list.get(i), short.class, serializerSet);
}
return array;
} else if (wantedType.equals(byte[].class)) {
byte[] array = new byte[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = SerializableConfig.deserializeAs(list.get(i), byte.class, serializerSet);
}
return array;
} else if (wantedType.equals(boolean[].class)) {
boolean[] array = new boolean[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = SerializableConfig.deserializeAs(list.get(i), boolean.class, serializerSet);
}
return array;
} else if (wantedType.equals(Object[].class)) {
Object[] array = new Object[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = SerializableConfig.deserializeAs(list.get(i), wantedType.getComponentType(), serializerSet);
}
return array;
}
return list.toArray((Object[]) Array.newInstance(wantedType, list.size()));
}
}