package net.minecraft.util; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.Optional; import java.util.function.Predicate; import java.util.regex.Pattern; import net.minecraft.resources.ResourceLocation; public class ResourceLocationPattern { public static final Codec CODEC = RecordCodecBuilder.create( instance -> instance.group( ExtraCodecs.PATTERN.optionalFieldOf("namespace").forGetter(resourceLocationPattern -> resourceLocationPattern.namespacePattern), ExtraCodecs.PATTERN.optionalFieldOf("path").forGetter(resourceLocationPattern -> resourceLocationPattern.pathPattern) ) .apply(instance, ResourceLocationPattern::new) ); private final Optional namespacePattern; private final Predicate namespacePredicate; private final Optional pathPattern; private final Predicate pathPredicate; private final Predicate locationPredicate; private ResourceLocationPattern(Optional namespacePattern, Optional pathPattern) { this.namespacePattern = namespacePattern; this.namespacePredicate = (Predicate)namespacePattern.map(Pattern::asPredicate).orElse((Predicate)string -> true); this.pathPattern = pathPattern; this.pathPredicate = (Predicate)pathPattern.map(Pattern::asPredicate).orElse((Predicate)string -> true); this.locationPredicate = resourceLocation -> this.namespacePredicate.test(resourceLocation.getNamespace()) && this.pathPredicate.test(resourceLocation.getPath()); } public Predicate namespacePredicate() { return this.namespacePredicate; } public Predicate pathPredicate() { return this.pathPredicate; } public Predicate locationPredicate() { return this.locationPredicate; } }