Skip to content

Commit

Permalink
Add fixed codecs and implement toString in LibX codecs.
Browse files Browse the repository at this point in the history
  • Loading branch information
noeppi-noeppi committed Feb 4, 2024
1 parent b0278b3 commit 86d88f2
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 0 deletions.
28 changes: 28 additions & 0 deletions src/main/java/org/moddingx/libx/codec/MoreCodecs.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.moddingx.libx.codec;

import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.*;
import net.minecraft.nbt.CompoundTag;
Expand Down Expand Up @@ -75,6 +76,33 @@ public static <T> Codec<T> error(String encodeMsg, String decodeMsg) {
public static <T> Codec<Optional<T>> option(Codec<T> codec) {
return new OptionCodec<>(codec);
}

/**
* Creates a fixed codec that always encodes the {@link Unit#INSTANCE unit value} to the given serialized value.
* Decoding fille succeed if the serialized value equals the given value, otherwise it fails. Fixed codecs are
* useful in {@link Codec#either(Codec, Codec) either}-codecs.
*/
public static Codec<Unit> fixed(Number value) {
return fixed(new Dynamic<>(JsonOps.INSTANCE, new JsonPrimitive(value)));
}

/**
* Creates a fixed codec that always encodes the {@link Unit#INSTANCE unit value} to the given serialized value.
* Decoding fille succeed if the serialized value equals the given value, otherwise it fails. Fixed codecs are
* useful in {@link Codec#either(Codec, Codec) either}-codecs.
*/
public static Codec<Unit> fixed(String value) {
return fixed(new Dynamic<>(JsonOps.INSTANCE, new JsonPrimitive(value)));
}

/**
* Creates a fixed codec that always encodes the {@link Unit#INSTANCE unit value} to the given serialized value.
* Decoding fille succeed if the serialized value equals the given value, otherwise it fails. Fixed codecs are
* useful in {@link Codec#either(Codec, Codec) either}-codecs.
*/
public static Codec<Unit> fixed(Dynamic<?> value) {
return new FixedCodec<>(value);
}

/**
* Gets a codec that encodes an {@link Enum enum} as a string.
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/org/moddingx/libx/impl/codec/EnumCodec.java
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,9 @@ private <T> DataResult<Pair<A, T>> decodeByName(DynamicOps<T> ops, T input) {
.flatMap(str -> CodecHelper.doesNotThrow(() -> Enum.valueOf(this.clazz, str)))
.map(r -> Pair.of(r, ops.empty()));
}

@Override
public String toString() {
return "EnumCodec[" + this.clazz.getName() + "]";
}
}
5 changes: 5 additions & 0 deletions src/main/java/org/moddingx/libx/impl/codec/ErrorCodec.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,9 @@ public <T> DataResult<T> encode(A input, DynamicOps<T> ops, T prefix) {
public <T> DataResult<Pair<A, T>> decode(DynamicOps<T> ops, T input) {
return DataResult.error(() -> this.decodeMsg);
}

@Override
public String toString() {
return "ErrorCodec[enc=" + this.encodeMsg + ", dec=" + this.decodeMsg + "]";
}
}
40 changes: 40 additions & 0 deletions src/main/java/org/moddingx/libx/impl/codec/FixedCodec.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package org.moddingx.libx.impl.codec;

import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.Dynamic;
import com.mojang.serialization.DynamicOps;
import net.minecraft.util.Unit;

import java.util.Objects;

public class FixedCodec<A> implements Codec<Unit> {

private final Dynamic<A> serializedValue;

public FixedCodec(Dynamic<A> serializedValue) {
this.serializedValue = serializedValue;
}


@Override
public <T> DataResult<T> encode(Unit unit, DynamicOps<T> ops, T prefix) {
return ops.mergeToPrimitive(prefix, this.serializedValue.convert(ops).getValue());
}

@Override
public <T> DataResult<Pair<Unit, T>> decode(DynamicOps<T> ops, T input) {
Dynamic<A> dynamic = new Dynamic<>(ops, input).convert(this.serializedValue.getOps());
if (Objects.equals(this.serializedValue, dynamic)) {
return DataResult.success(Pair.of(Unit.INSTANCE, ops.empty()));
} else {
return DataResult.error(() -> "Wrong value in fixed codec.");
}
}

@Override
public String toString() {
return "FixedCodec[" + this.serializedValue + "]";
}
}
5 changes: 5 additions & 0 deletions src/main/java/org/moddingx/libx/impl/codec/LazyCodec.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,9 @@ public <T> DataResult<T> encode(A input, DynamicOps<T> ops, T prefix) {
public <T> DataResult<Pair<A, T>> decode(DynamicOps<T> ops, T input) {
return this.codec.get().decode(ops, input);
}

@Override
public String toString() {
return "LazyCodec[...]";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,9 @@ public <T> DataResult<Pair<A, T>> decode(DynamicOps<T> ops, T input) {
)
);
}

@Override
public String toString() {
return "MapDispatchedCodec[key=" + this.keyCodec + "]";
}
}
6 changes: 6 additions & 0 deletions src/main/java/org/moddingx/libx/impl/codec/OptionCodec.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.DynamicOps;
import com.mojang.serialization.Lifecycle;

import java.util.Objects;
import java.util.Optional;
Expand Down Expand Up @@ -47,4 +48,9 @@ public <T> DataResult<Pair<Optional<A>, T>> decode(DynamicOps<T> ops, T input) {
}
});
}

@Override
public String toString() {
return "OptionCodec[" + this.codec + "]";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,9 @@ public <T> RecordBuilder<T> encode(final Optional<A> input, final DynamicOps<T>
return prefix;
}
}

@Override
public String toString() {
return "TrueOptionalMapCodec[" + this.name + ": " + this.codec + "]";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import javax.annotation.Nullable;
import java.util.List;
import java.util.stream.Collectors;

public class TypeMappedCodec<A> implements Codec<A> {

Expand Down Expand Up @@ -50,4 +51,9 @@ public <T> DataResult<Pair<A, T>> decode(DynamicOps<T> ops, T input) {
return this.fallback.decode(ops, input);
}
}

@Override
public String toString() {
return "TypeMappedCodec[known=" + this.encoders.stream().map(TypedEncoder::resultClass).map(Class::getName).collect(Collectors.joining(", ", "(", ")")) + ", fallback=" + this.fallback + "]";
}
}

0 comments on commit 86d88f2

Please sign in to comment.