package launcher.serialize.config.entry; import launcher.LauncherAPI; import launcher.serialize.HInput; import launcher.serialize.HOutput; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Stream; public final class ListConfigEntry extends ConfigEntry<List<ConfigEntry<?>>> { @LauncherAPI public ListConfigEntry(List<ConfigEntry<?>> value, boolean ro, int cc) { super(value, ro, cc); } @LauncherAPI public ListConfigEntry(HInput input, boolean ro) throws IOException { super(readList(input, ro), ro, 0); } private static List<ConfigEntry<?>> readList(HInput input, boolean ro) throws IOException { int elementsCount = input.readLength(0); List<ConfigEntry<?>> list = new ArrayList<>(elementsCount); for (int i = 0; i < elementsCount; i++) { list.add(readEntry(input, ro)); } return list; } @Override public Type getType() { return Type.LIST; } @Override protected void uncheckedSetValue(List<ConfigEntry<?>> value) { List<ConfigEntry<?>> list = new ArrayList<>(value); super.uncheckedSetValue(ro ? Collections.unmodifiableList(list) : list); } @Override public void write(HOutput output) throws IOException { List<ConfigEntry<?>> value = getValue(); output.writeLength(value.size(), 0); for (ConfigEntry<?> element : value) { writeEntry(element, output); } } @LauncherAPI public <V, E extends ConfigEntry<V>> Stream<V> stream(Class<E> clazz) { return getValue().stream().map(clazz::cast).map(ConfigEntry::getValue); } @LauncherAPI public void verifyOfType(Type type) { if (getValue().stream().anyMatch(e -> e.getType() != type)) { throw new IllegalArgumentException("List type mismatch: " + type.name()); } } }