Respackopts/src/main/java/io/gitlab/jfronny/respackopts/filters/util/DirRpoResult.java
JFronny 1a8977ee3f
All checks were successful
ci/woodpecker/push/docs Pipeline was successful
ci/woodpecker/push/jfmod Pipeline was successful
feat: clean up DirFilterEvents and adjust behavior for new packs
2023-08-19 19:29:13 +02:00

88 lines
3.7 KiB
Java

package io.gitlab.jfronny.respackopts.filters.util;
import io.gitlab.jfronny.commons.LazySupplier;
import io.gitlab.jfronny.muscript.data.Scope;
import io.gitlab.jfronny.muscript.debug.ObjectGraphPrinter;
import io.gitlab.jfronny.respackopts.Respackopts;
import io.gitlab.jfronny.respackopts.model.Condition;
import io.gitlab.jfronny.respackopts.model.DirRpo;
import io.gitlab.jfronny.respackopts.model.cache.CacheKey;
import io.gitlab.jfronny.respackopts.util.MetaCache;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public sealed interface DirRpoResult {
FixedState IGNORE = FixedState.IGNORE;
FixedState ORIGINAL = FixedState.ORIGINAL;
static Replacement replacement(String originalPrefix, String fallbackPrefix, int version) {
return new Replacement(originalPrefix, fallbackPrefix, version);
}
static DirRpoResult compute(String file, List<DirRpo> rpos, CacheKey key) {
int version = MetaCache.getState(key).metadata().version;
if (version < 11) rpos = rpos.isEmpty() ? rpos : List.of(rpos.get(rpos.size() - 1));
LazySupplier<Scope> scope = new LazySupplier<>(() -> MetaCache.getScope(key));
for (DirRpo rpo : rpos) {
if (rpo.condition == null) continue;
try {
if (rpo.condition.get(scope.get())) continue;
// Condition does not apply, find fallback
if (rpo.fallback == null) return IGNORE;
return replacement(rpo.path + "/", rpo.fallback, version);
} catch (Condition.ConditionException e) {
String res = "Could not evaluate condition for " + file + " (pack: " + key.packName() + ")";
try {
Respackopts.LOGGER.error(res + " with condition:\n" + ObjectGraphPrinter.printGraph(rpo.condition) + ")", e);
} catch (Throwable ex) {
Respackopts.LOGGER.error(res, e);
}
}
}
return ORIGINAL;
}
enum FixedState implements DirRpoResult {IGNORE, ORIGINAL}
final class Replacement implements DirRpoResult {
private final String originalPrefix;
private final Pattern originalPattern;
private final String fallbackPrefix;
private final Pattern fallbackPattern;
private final int version;
public Replacement(String originalPrefix, String fallbackPrefix, int version) {
this.originalPrefix = Matcher.quoteReplacement(originalPrefix);
this.originalPattern = Pattern.compile(Pattern.quote(originalPrefix));
this.fallbackPrefix = Matcher.quoteReplacement(fallbackPrefix);
this.fallbackPattern = Pattern.compile(Pattern.quote(fallbackPrefix));
this.version = version;
}
public String toFallback(String original) {
Matcher m = originalPattern.matcher(original);
if (version < 11) {
return m.replaceAll(fallbackPrefix);
}
if (!m.find()) {
Respackopts.LOGGER.error("Attempted conversion to fallback path, but could not find original prefix for: " + original);
return original;
}
return m.replaceFirst(fallbackPrefix);
}
public String toOriginal(String fallback) {
Matcher m = fallbackPattern.matcher(fallback);
if (version < 11) {
return m.replaceAll(originalPrefix);
}
if (!m.find()) {
Respackopts.LOGGER.error("Attempted conversion to original path, but could not find fallback prefix for: " + fallback);
return fallback;
}
return m.replaceFirst(originalPrefix);
}
}
}