42 lines
1.6 KiB
Java
42 lines
1.6 KiB
Java
package net.minecraft.util.datafix.fixes;
|
|
|
|
import com.mojang.datafixers.DataFix;
|
|
import com.mojang.datafixers.TypeRewriteRule;
|
|
import com.mojang.datafixers.DSL.TypeReference;
|
|
import com.mojang.datafixers.schemas.Schema;
|
|
import com.mojang.datafixers.types.Type;
|
|
import com.mojang.datafixers.types.templates.TaggedChoice.TaggedChoiceType;
|
|
import com.mojang.datafixers.util.Pair;
|
|
import java.util.Locale;
|
|
|
|
public class AddNewChoices extends DataFix {
|
|
private final String name;
|
|
private final TypeReference type;
|
|
|
|
public AddNewChoices(Schema outputSchema, String name, TypeReference type) {
|
|
super(outputSchema, true);
|
|
this.name = name;
|
|
this.type = type;
|
|
}
|
|
|
|
@Override
|
|
public TypeRewriteRule makeRule() {
|
|
TaggedChoiceType<?> taggedChoiceType = this.getInputSchema().findChoiceType(this.type);
|
|
TaggedChoiceType<?> taggedChoiceType2 = this.getOutputSchema().findChoiceType(this.type);
|
|
return this.cap(taggedChoiceType, taggedChoiceType2);
|
|
}
|
|
|
|
private <K> TypeRewriteRule cap(TaggedChoiceType<K> inputChoiceType, TaggedChoiceType<?> outputChoiceType) {
|
|
if (inputChoiceType.getKeyType() != outputChoiceType.getKeyType()) {
|
|
throw new IllegalStateException("Could not inject: key type is not the same");
|
|
} else {
|
|
return this.fixTypeEverywhere(this.name, inputChoiceType, (Type<Pair<K, ?>>)outputChoiceType, dynamicOps -> pair -> {
|
|
if (!((TaggedChoiceType<Object>)outputChoiceType).hasType(pair.getFirst())) {
|
|
throw new IllegalArgumentException(String.format(Locale.ROOT, "%s: Unknown type %s in '%s'", this.name, pair.getFirst(), this.type.typeName()));
|
|
} else {
|
|
return pair;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|