![JAR search and dependency download from the Maven repository](/logo.png)
personthecat.catlib.serialization.codec.DynamicCodec Maven / Gradle / Ivy
package personthecat.catlib.serialization.codec;
import com.google.common.collect.ImmutableMap;
import com.mojang.datafixers.util.Pair;
import com.mojang.datafixers.util.Unit;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.DynamicOps;
import org.apache.commons.lang3.mutable.MutableObject;
import personthecat.catlib.exception.UnreachableException;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Stream;
@SuppressWarnings("unused")
public class DynamicCodec implements Codec {
private final Supplier builder;
private final Function in;
private final Function out;
private final Map> fields;
private final Map> implicitFields;
private final Map> requiredFields;
@SafeVarargs
public DynamicCodec(final Supplier builder, final Function in, final Function out, final DynamicField... fields) {
this(builder, in, out, createMap(fields));
}
protected DynamicCodec(final Supplier builder, final Function in, final Function out, final Map> fields) {
this.builder = builder;
this.in = in;
this.out = out;
this.fields = fields;
this.implicitFields = getFields(fields.values(), DynamicField.Type.IMPLICIT);
this.requiredFields = getFields(fields.values(), DynamicField.Type.NONNULL);
}
public static Builder builder(final Supplier builder, final Function in, final Function out) {
return new Builder<>(builder, in, out);
}
public DynamicCodec withBuilder(final Supplier builder) {
return new DynamicCodec<>(builder, this.in, this.out, this.fields);
}
public DynamicCodec withReader(final Function reader) {
return new DynamicCodec<>(this.builder, reader, this.out, this.fields);
}
public DynamicCodec withWriter(final Function writer) {
return new DynamicCodec<>(this.builder, this.in, writer, this.fields);
}
@SafeVarargs
public final DynamicCodec withMoreFields(final DynamicField... fields) {
final ImmutableMap.Builder> map = ImmutableMap.builder();
map.putAll(this.fields);
map.putAll(createMap(fields));
return new DynamicCodec<>(this.builder, this.in, this.out, map.build());
}
public DynamicCodec withoutFields(final String... fields) {
final Map> map = new HashMap<>(this.fields);
for (final String field : fields) {
map.remove(field);
}
return new DynamicCodec<>(this.builder, this.in, this.out, ImmutableMap.copyOf(map));
}
@SafeVarargs
public final DynamicCodec withoutFields(final DynamicField... fields) {
final Map> map = new HashMap<>(this.fields);
for (final DynamicField field : fields) {
map.remove(field.key);
}
return new DynamicCodec<>(this.builder, this.in, this.out, ImmutableMap.copyOf(map));
}
private static Map> createMap(final DynamicField[] fields) {
final ImmutableMap.Builder> map = ImmutableMap.builder();
for (final DynamicField field : fields) {
map.put(field.key, field);
}
return map.build();
}
private static Map> getFields(
final Collection> all, final DynamicField.Type type) {
final ImmutableMap.Builder> fields = ImmutableMap.builder();
for (final DynamicField field : all) {
if (field.type == type) {
fields.put(field.key, field);
}
}
return fields.build();
}
@Override
@SuppressWarnings("unchecked")
public DataResult encode(final A input, final DynamicOps ops, final T prefix) {
if (input == null) {
return DataResult.error("Input is null");
}
final R reader = this.in.apply(input);
final Map map = new HashMap<>();
final List errors = new ArrayList<>();
for (final DynamicField field : this.fields.values()) {
Codec
© 2015 - 2025 Weber Informatics LLC | Privacy Policy