aboutsummaryrefslogtreecommitdiff
path: root/runtime/src/main/java/me/shedaniel/rei/impl
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/src/main/java/me/shedaniel/rei/impl')
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java8
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java5
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java7
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/OverlaySearchFieldSyntaxHighlighter.java9
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java219
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/TypedEntryStack.java13
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/SearchFilteringRule.java25
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/AlternativeArgument.java45
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/AlwaysMatchingArgumentType.java (renamed from runtime/src/main/java/me/shedaniel/rei/impl/search/AlwaysMatchingArgument.java)10
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/Argument.java189
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/ArgumentApplicableResult.java (renamed from runtime/src/main/java/me/shedaniel/rei/impl/search/MatchStatus.java)38
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/ArgumentType.java81
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/ArgumentTypesRegistry.java (renamed from runtime/src/main/java/me/shedaniel/rei/impl/search/ArgumentsRegistry.java)25
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/CompoundArgument.java63
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/IdentifierArgumentType.java93
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/ModArgumentType.java (renamed from runtime/src/main/java/me/shedaniel/rei/impl/search/ModArgument.java)13
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/RegexArgumentType.java (renamed from runtime/src/main/java/me/shedaniel/rei/impl/search/RegexArgument.java)13
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/SearchProviderImpl.java39
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/TagArgumentType.java (renamed from runtime/src/main/java/me/shedaniel/rei/impl/search/TagArgument.java)10
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/TextArgumentType.java (renamed from runtime/src/main/java/me/shedaniel/rei/impl/search/TextArgument.java)9
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/search/TooltipArgumentType.java (renamed from runtime/src/main/java/me/shedaniel/rei/impl/search/TooltipArgument.java)9
23 files changed, 585 insertions, 346 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java
index c065ff64e..c77193309 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java
@@ -36,6 +36,7 @@ import me.shedaniel.rei.api.gui.widgets.Tooltip;
import me.shedaniel.rei.api.ingredient.EntryStack;
import me.shedaniel.rei.api.ingredient.entry.comparison.ComparisonContext;
import me.shedaniel.rei.api.ingredient.util.EntryStacks;
+import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
@@ -107,13 +108,16 @@ public abstract class AbstractEntryStack<A> extends AbstractRenderer implements
@Override
@Nullable
public Tooltip getTooltip(Point mouse) {
- Tooltip[] tooltip = {this.getDefinition().getRenderer().getTooltip(this, mouse)};
+ Tooltip[] tooltip = {this.get(Settings.RENDER).apply(this).<A>cast().getTooltip(this, mouse)};
if (tooltip[0] == null) return null;
tooltip[0].getText().addAll(get(EntryStack.Settings.TOOLTIP_APPEND_EXTRA).apply(this));
tooltip[0] = get(EntryStack.Settings.TOOLTIP_PROCESSOR).apply(this, tooltip[0]);
if (tooltip[0] == null) return null;
if (ConfigObject.getInstance().shouldAppendModNames()) {
- getIdentifier().ifPresent(location -> ClientHelper.getInstance().appendModIdToTooltips(tooltip[0].getText(), location.getNamespace()));
+ ResourceLocation location = getIdentifier();
+ if (location != null) {
+ ClientHelper.getInstance().appendModIdToTooltips(tooltip[0].getText(), location.getNamespace());
+ }
}
return tooltip[0];
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java
index e2e2460a6..a498fd2f1 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java
@@ -172,9 +172,10 @@ public class ClientHelperImpl implements ClientHelper {
return false;
}
} else {
- ResourceLocation identifier = entry.getIdentifier().orElse(null);
- if (identifier == null)
+ ResourceLocation identifier = entry.getIdentifier();
+ if (identifier == null) {
return false;
+ }
String tagMessage = cheatedStack.copy().getTag() != null && !cheatedStack.copy().getTag().isEmpty() ? cheatedStack.copy().getTag().getAsString() : "";
String og = cheatedStack.getCount() == 1 ? ConfigObject.getInstance().getGiveCommand().replaceAll(" \\{count}", "") : ConfigObject.getInstance().getGiveCommand();
String madeUpCommand = og.replaceAll("\\{player_name}", Minecraft.getInstance().player.getScoreboardName()).replaceAll("\\{item_name}", identifier.getPath()).replaceAll("\\{item_identifier}", identifier.toString()).replaceAll("\\{nbt}", tagMessage).replaceAll("\\{count}", String.valueOf(cheatedStack.getCount()));
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java
index 9c019f19a..500713fd3 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java
@@ -371,6 +371,11 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData {
}
@Override
+ public SearchMode getIdentifierSearchMode() {
+ return advanced.search.identifierSearch;
+ }
+
+ @Override
public SearchMode getModSearchMode() {
return advanced.search.modSearch;
}
@@ -512,6 +517,8 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData {
@ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON)
private SearchMode tagSearch = SearchMode.PREFIX;
@ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON)
+ private SearchMode identifierSearch = SearchMode.ALWAYS;
+ @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON)
private SearchMode modSearch = SearchMode.PREFIX;
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/OverlaySearchFieldSyntaxHighlighter.java b/runtime/src/main/java/me/shedaniel/rei/impl/OverlaySearchFieldSyntaxHighlighter.java
index c2faf9110..25e92b926 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/OverlaySearchFieldSyntaxHighlighter.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/OverlaySearchFieldSyntaxHighlighter.java
@@ -24,7 +24,8 @@
package me.shedaniel.rei.impl;
import me.shedaniel.rei.gui.OverlaySearchField;
-import me.shedaniel.rei.impl.search.ArgumentsRegistry;
+import me.shedaniel.rei.impl.search.ArgumentTypesRegistry;
+import me.shedaniel.rei.impl.search.Argument;
import net.minecraft.util.IntRange;
import org.jetbrains.annotations.ApiStatus;
@@ -44,7 +45,7 @@ public class OverlaySearchFieldSyntaxHighlighter implements Consumer<String> {
@Override
public void accept(String text) {
this.highlighted = new byte[text.length()];
- SearchArgument.processSearchTerm(text, new SearchArgument.ProcessedSink() {
+ Argument.bakeArguments(text, new Argument.ProcessedSink() {
@Override
public void addQuote(int index) {
highlighted[index] = -2;
@@ -56,9 +57,9 @@ public class OverlaySearchFieldSyntaxHighlighter implements Consumer<String> {
}
@Override
- public void addPart(SearchArgument<?, ?> argument, boolean usingGrammar, Collection<IntRange> grammarRanges, int index) {
+ public void addPart(Argument<?, ?> argument, boolean usingGrammar, Collection<IntRange> grammarRanges, int index) {
if (usingGrammar) {
- int argIndex = ArgumentsRegistry.ARGUMENT_LIST.indexOf(argument.getArgument()) * 2 + 1;
+ int argIndex = ArgumentTypesRegistry.ARGUMENT_TYPE_LIST.indexOf(argument.getArgument()) * 2 + 1;
for (int i = argument.start(); i < argument.end(); i++) {
highlighted[i] = (byte) argIndex;
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java
index 031f4b22e..e0d4f7274 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java
@@ -38,6 +38,7 @@ import me.shedaniel.rei.api.util.CollectionUtils;
import me.shedaniel.rei.impl.entry.ItemComparatorRegistryImpl;
import me.shedaniel.rei.impl.registry.CategoryRegistryImpl;
import me.shedaniel.rei.impl.registry.DisplayRegistryImpl;
+import me.shedaniel.rei.impl.search.SearchProviderImpl;
import me.shedaniel.rei.impl.subsets.SubsetsRegistryImpl;
import me.shedaniel.rei.impl.transfer.TransferHandlerRegistryImpl;
import net.fabricmc.api.EnvType;
@@ -62,6 +63,7 @@ public class PluginManagerImpl implements PluginManager {
private final List<REIPlugin> plugins = new ArrayList<>();
public PluginManagerImpl() {
+ registerReloadable(new SearchProviderImpl());
registerReloadable(new ConfigManagerImpl());
registerReloadable(new EntryTypeRegistryImpl());
registerReloadable(new ItemComparatorRegistryImpl());
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java b/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java
deleted file mode 100644
index bb209c019..000000000
--- a/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * This file is licensed under the MIT License, part of Roughly Enough Items.
- * Copyright (c) 2018, 2019, 2020 shedaniel
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package me.shedaniel.rei.impl;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.Lists;
-import me.shedaniel.math.Point;
-import me.shedaniel.rei.api.gui.config.SearchMode;
-import me.shedaniel.rei.api.gui.widgets.Tooltip;
-import me.shedaniel.rei.api.ingredient.EntryStack;
-import me.shedaniel.rei.api.util.CollectionUtils;
-import me.shedaniel.rei.impl.search.AlwaysMatchingArgument;
-import me.shedaniel.rei.impl.search.Argument;
-import me.shedaniel.rei.impl.search.ArgumentsRegistry;
-import me.shedaniel.rei.impl.search.MatchStatus;
-import net.fabricmc.api.EnvType;
-import net.fabricmc.api.Environment;
-import net.minecraft.client.Minecraft;
-import net.minecraft.network.chat.Component;
-import net.minecraft.util.IntRange;
-import net.minecraft.util.Unit;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.mutable.Mutable;
-import org.apache.commons.lang3.mutable.MutableObject;
-import org.jetbrains.annotations.ApiStatus;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Locale;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-@ApiStatus.Internal
-@Environment(EnvType.CLIENT)
-public class SearchArgument<T, R> {
- public static final String SPACE = " ", EMPTY = "";
- private static final SearchArgument<Unit, Unit> ALWAYS = new SearchArgument<>(AlwaysMatchingArgument.INSTANCE, EMPTY, true, -1, -1);
- private Argument<T, R> argument;
- private String text;
- private T filterData;
- private boolean regular;
- private final int start;
- private final int end;
- private static final Pattern SPLIT_PATTERN = Pattern.compile("(?:\"([^\"]*)\")|([^\\s]+)");
-
- public SearchArgument(Argument<T, R> argument, String text, boolean regular, int start, int end) {
- this(argument, text, regular, start, end, true);
- }
-
- public SearchArgument(Argument<T, R> argument, String text, boolean regular, int start, int end, boolean lowercase) {
- this.argument = argument;
- this.text = lowercase ? text.toLowerCase(Locale.ROOT) : text;
- this.regular = regular;
- this.filterData = null;
- this.start = start;
- this.end = end;
- }
-
- public int start() {
- return start;
- }
-
- public int end() {
- return end;
- }
-
- public interface ProcessedSink {
- void addQuote(int index);
-
- void addSplitter(int index);
-
- void addPart(SearchArgument<?, ?> argument, boolean usingGrammar, Collection<IntRange> grammarRanges, int index);
- }
-
- @ApiStatus.Internal
- public static List<SearchArgument.SearchArguments> processSearchTerm(String searchTerm) {
- return processSearchTerm(searchTerm, null);
- }
-
- @ApiStatus.Internal
- public static List<SearchArgument.SearchArguments> processSearchTerm(String searchTerm, @Nullable ProcessedSink sink) {
- List<SearchArgument.SearchArguments> searchArguments = Lists.newArrayList();
- int tokenStartIndex = 0;
- String[] allTokens = StringUtils.splitByWholeSeparatorPreserveAllTokens(searchTerm, "|");
- for (String token : allTokens) {
- Matcher terms = SPLIT_PATTERN.matcher(token);
- List<SearchArgument<?, ?>> arguments = Lists.newArrayList();
- while (terms.find()) {
- String term = MoreObjects.firstNonNull(terms.group(1), terms.group(2));
- for (Argument<?, ?> argument : ArgumentsRegistry.ARGUMENT_LIST) {
- if (argument.getSearchMode() == SearchMode.NEVER) continue;
- MatchStatus status = argument.matchesArgumentPrefix(term);
- if (status.isMatched()) {
- SearchArgument<?, ?> searchArgument;
- if (terms.group(1) != null) {
- arguments.add(searchArgument = new SearchArgument<>(argument, status.getText(), !status.isInverted(), terms.start(1) + tokenStartIndex, terms.end(1) + tokenStartIndex, !status.shouldPreserveCasing()));
- if (sink != null) {
- sink.addQuote(terms.start() + tokenStartIndex);
- if (terms.end() - 1 + tokenStartIndex < searchTerm.length()) {
- sink.addQuote(terms.end() - 1 + tokenStartIndex);
- }
- }
- } else {
- arguments.add(searchArgument = new SearchArgument<>(argument, status.getText(), !status.isInverted(), terms.start(2) + tokenStartIndex, terms.end(2) + tokenStartIndex, !status.shouldPreserveCasing()));
- }
- if (sink != null) {
- sink.addPart(searchArgument, status.isUsingGrammar(), status.grammarRanges(), terms.start() + tokenStartIndex);
- }
- break;
- }
- }
- }
- if (arguments.isEmpty()) {
- searchArguments.add(SearchArgument.SearchArguments.ALWAYS);
- } else {
- searchArguments.add(new SearchArgument.SearchArguments(arguments.toArray(new SearchArgument[0])));
- }
- tokenStartIndex += 1 + token.length();
- if (sink != null && tokenStartIndex - 1 < searchTerm.length()) {
- sink.addSplitter(tokenStartIndex - 1);
- }
- }
- for (SearchArguments arguments : searchArguments) {
- for (SearchArgument<?, ?> argument : arguments.getArguments()) {
- //noinspection RedundantCast
- ((SearchArgument<Object, Object>) argument).filterData = argument.argument.prepareSearchFilter(argument.getText());
- }
- }
- return searchArguments;
- }
-
- @ApiStatus.Internal
- public static boolean canSearchTermsBeAppliedTo(EntryStack<?> stack, List<SearchArgument.SearchArguments> searchArguments) {
- if (searchArguments.isEmpty())
- return true;
- Minecraft minecraft = Minecraft.getInstance();
- Mutable<?> mutable = new MutableObject<>();
- for (SearchArgument.SearchArguments arguments : searchArguments) {
- boolean applicable = true;
- for (SearchArgument<?, ?> argument : arguments.getArguments()) {
- mutable.setValue(null);
- if (matches(argument.getArgument(), mutable, stack, argument.getText(), argument.filterData) != argument.isRegular()) {
- applicable = false;
- break;
- }
- }
- if (applicable)
- return true;
- }
- return false;
- }
-
- private static <T, R, Z, B> boolean matches(Argument<T, B> argument, Mutable<Z> data, EntryStack<?> stack, String filter, R filterData) {
- return argument.matches((Mutable<B>) data, stack, filter, (T) filterData);
- }
-
- public static String tryGetEntryStackTooltip(EntryStack<?> stack) {
- Tooltip tooltip = stack.getTooltip(new Point());
- if (tooltip != null)
- return CollectionUtils.mapAndJoinToString(tooltip.getText(), Component::getString, "\n");
- return "";
- }
-
- public Argument<?, ?> getArgument() {
- return argument;
- }
-
- public String getText() {
- return text;
- }
-
- public boolean isRegular() {
- return regular;
- }
-
- @Override
- public String toString() {
- return String.format("Argument[%s]: name = %s, regular = %b", argument.getName(), text, regular);
- }
-
- public static class SearchArguments {
- public static final SearchArguments ALWAYS = new SearchArguments(SearchArgument.ALWAYS);
- private SearchArgument<?, ?>[] arguments;
-
- public SearchArguments(SearchArgument<?, ?>... arguments) {
- this.arguments = arguments;
- }
-
- public SearchArgument<?, ?>[] getArguments() {
- return arguments;
- }
-
- public final boolean isAlways() {
- return this == ALWAYS;
- }
- }
-}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/TypedEntryStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/TypedEntryStack.java
index 367d67453..5ec4909c1 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/TypedEntryStack.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/TypedEntryStack.java
@@ -25,8 +25,8 @@ package me.shedaniel.rei.impl;
import it.unimi.dsi.fastutil.shorts.Short2ObjectMap;
import me.shedaniel.rei.api.ingredient.EntryStack;
-import me.shedaniel.rei.api.ingredient.entry.type.BuiltinEntryTypes;
import me.shedaniel.rei.api.ingredient.entry.comparison.ComparisonContext;
+import me.shedaniel.rei.api.ingredient.entry.type.BuiltinEntryTypes;
import me.shedaniel.rei.api.ingredient.entry.type.EntryDefinition;
import me.shedaniel.rei.api.ingredient.entry.type.EntryType;
import net.minecraft.network.chat.Component;
@@ -34,8 +34,7 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Unit;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
-
-import java.util.Optional;
+import org.jetbrains.annotations.Nullable;
@ApiStatus.Internal
public class TypedEntryStack<T> extends AbstractEntryStack<T> {
@@ -65,7 +64,8 @@ public class TypedEntryStack<T> extends AbstractEntryStack<T> {
}
@Override
- public Optional<ResourceLocation> getIdentifier() {
+ @Nullable
+ public ResourceLocation getIdentifier() {
return getDefinition().getIdentifier(this, value);
}
@@ -102,11 +102,6 @@ public class TypedEntryStack<T> extends AbstractEntryStack<T> {
}
@Override
- public boolean equals(EntryStack<T> other, ComparisonContext context) {
- return this.getDefinition().equals(value, other.getValue(), context);
- }
-
- @Override
public int hash(ComparisonContext context) {
return getDefinition().hash(this, value, context);
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java
index cc6253622..b0a97da14 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java
@@ -47,7 +47,6 @@ import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.Collections;
import java.util.Objects;
-import java.util.Optional;
import java.util.function.Supplier;
@ApiStatus.Internal
@@ -87,8 +86,9 @@ public enum EmptyEntryDefinition implements EntryDefinition<Object>, EntrySerial
}
@Override
- public Optional<ResourceLocation> getIdentifier(EntryStack<Object> entry, Object value) {
- return Optional.empty();
+ @Nullable
+ public ResourceLocation getIdentifier(EntryStack<Object> entry, Object value) {
+ return null;
}
@Override
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/SearchFilteringRule.java b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/SearchFilteringRule.java
index 6d5dd25cf..2a08765e0 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/SearchFilteringRule.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/filtering/rules/SearchFilteringRule.java
@@ -27,11 +27,14 @@ import com.google.common.collect.Lists;
import me.shedaniel.rei.api.gui.config.entry.FilteringEntry;
import me.shedaniel.rei.api.gui.config.entry.FilteringRuleOptionsScreen;
import me.shedaniel.rei.api.ingredient.EntryStack;
+import me.shedaniel.rei.api.search.SearchFilter;
+import me.shedaniel.rei.api.search.SearchProvider;
import me.shedaniel.rei.api.util.CollectionUtils;
-import me.shedaniel.rei.impl.SearchArgument;
import me.shedaniel.rei.impl.filtering.AbstractFilteringRule;
import me.shedaniel.rei.impl.filtering.FilteringContext;
import me.shedaniel.rei.impl.filtering.FilteringResult;
+import me.shedaniel.rei.impl.search.Argument;
+import me.shedaniel.rei.impl.search.CompoundArgument;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.ChatFormatting;
@@ -54,22 +57,20 @@ import java.util.function.Consumer;
@Environment(EnvType.CLIENT)
public class SearchFilteringRule extends AbstractFilteringRule<SearchFilteringRule> {
- private String filter;
- private List<SearchArgument.SearchArguments> arguments;
+ private SearchFilter filter;
private boolean show;
public SearchFilteringRule() {
}
- public SearchFilteringRule(String filter, List<SearchArgument.SearchArguments> arguments, boolean show) {
+ public SearchFilteringRule(SearchFilter filter, boolean show) {
this.filter = filter;
- this.arguments = arguments;
this.show = show;
}
@Override
public CompoundTag toTag(CompoundTag tag) {
- tag.putString("filter", filter);
+ tag.putString("filter", filter.getFilter());
tag.putBoolean("show", show);
return tag;
}
@@ -78,7 +79,7 @@ public class SearchFilteringRule extends AbstractFilteringRule<SearchFilteringRu
public SearchFilteringRule createFromTag(CompoundTag tag) {
String filter = tag.getString("filter");
boolean show = tag.getBoolean("show");
- return new SearchFilteringRule(filter, SearchArgument.processSearchTerm(filter), show);
+ return new SearchFilteringRule(SearchProvider.getInstance().createFilter(filter), show);
}
@NotNull
@@ -109,7 +110,7 @@ public class SearchFilteringRule extends AbstractFilteringRule<SearchFilteringRu
@Override
public SearchFilteringRule createNew() {
- return new SearchFilteringRule("", Collections.singletonList(SearchArgument.SearchArguments.ALWAYS), true);
+ return new SearchFilteringRule(SearchFilter.matchAll(), true);
}
private void processList(Collection<EntryStack<?>> stacks, List<CompletableFuture<List<EntryStack<?>>>> completableFutures) {
@@ -117,8 +118,7 @@ public class SearchFilteringRule extends AbstractFilteringRule<SearchFilteringRu
completableFutures.add(CompletableFuture.supplyAsync(() -> {
List<EntryStack<?>> output = Lists.newArrayList();
for (EntryStack<?> stack : partitionStacks) {
- boolean shown = SearchArgument.canSearchTermsBeAppliedTo(stack, arguments);
- if (shown) {
+ if (filter.test(stack)) {
output.add(stack);
}
}
@@ -150,7 +150,7 @@ public class SearchFilteringRule extends AbstractFilteringRule<SearchFilteringRu
entryConsumer.accept(entry = new TextFieldRuleEntry(width - 36, rule, widget -> {
widget.setMaxLength(9999);
if (entry != null) widget.setValue(entry.getWidget().getValue());
- else widget.setValue(rule.filter);
+ else widget.setValue(rule.filter.getFilter());
}));
addEmpty(entryConsumer, 10);
addText(entryConsumer, new TranslatableComponent("rule.roughlyenoughitems.filtering.search.show").withStyle(ChatFormatting.GRAY));
@@ -161,8 +161,7 @@ public class SearchFilteringRule extends AbstractFilteringRule<SearchFilteringRu
@Override
public void save() {
- rule.filter = entry.getWidget().getValue();
- rule.arguments = SearchArgument.processSearchTerm(rule.filter);
+ rule.filter = SearchProvider.getInstance().createFilter(entry.getWidget().getValue());
rule.show = show.getBoolean();
}
});
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/search/AlternativeArgument.java b/runtime/src/main/java/me/shedaniel/rei/impl/search/AlternativeArgument.java
new file mode 100644
index 000000000..71a62ce2f
--- /dev/null
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/search/AlternativeArgument.java
@@ -0,0 +1,45 @@
+package me.shedaniel.rei.impl.search;
+
+import com.google.common.collect.ForwardingList;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class AlternativeArgument extends ForwardingList<Argument<?, ?>> {
+ static final AlternativeArgument EMPTY = new AlternativeArgument(Collections.emptyList());
+
+ private final List<Argument<?, ?>> arguments;
+
+ public AlternativeArgument(List<Argument<?, ?>> arguments) {
+ this.arguments = arguments;
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ @Override
+ protected List<Argument<?, ?>> delegate() {
+ return arguments;
+ }
+
+ public static class Builder {
+ private List<Argument<?, ?>> arguments;
+
+ public <T, R> Builder add(Argument<T, R> argument) {
+ if (arguments == null) {
+ this.arguments = new ArrayList<>();
+ }
+
+ arguments.add(argument);
+ return this;
+ }
+
+ public AlternativeArgument build() {
+ if (arguments == null) return AlternativeArgument.EMPTY;
+ if (arguments.size() == 1) return new AlternativeArgument(Collections.singletonList(arguments.get(0)));
+ return new AlternativeArgument(arguments);
+ }
+ }
+}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/search/AlwaysMatchingArgument.java b/runtime/src/main/java/me/shedaniel/rei/impl/search/AlwaysMatchingArgumentType.java
index 065f3a676..c8048261a 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/search/AlwaysMatchingArgument.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/search/AlwaysMatchingArgumentType.java
@@ -32,8 +32,8 @@ import org.jetbrains.annotations.ApiStatus;
@ApiStatus.Internal
@Environment(EnvType.CLIENT)
-public final class AlwaysMatchingArgument extends Argument<Unit, Unit> {
- public static final AlwaysMatchingArgument INSTANCE = new AlwaysMatchingArgument();
+public final class AlwaysMatchingArgumentType extends ArgumentType<Unit, Unit> {
+ public static final AlwaysMatchingArgumentType INSTANCE = new AlwaysMatchingArgumentType();
@Override
public String getName() {
@@ -51,10 +51,10 @@ public final class AlwaysMatchingArgument extends Argument<Unit, Unit> {
}
@Override
- public MatchStatus matchesArgumentPrefix(String text) {
- return MatchStatus.unmatched();
+ public ArgumentApplicableResult checkApplicable(String text) {
+ return ArgumentApplicableResult.notApplicable();
}
- private AlwaysMatchingArgument() {
+ private AlwaysMatchingArgumentType() {
}
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/search/Argument.java b/runtime/src/main/java/me/shedaniel/rei/impl/search/Argument.java
index dd0ca4eb8..f1359e825 100644