mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-24 05:21:16 +00:00
add more api helpers
This commit is contained in:
+5
-4
@@ -62,9 +62,10 @@ public class LootFunction implements Function<Void> {
|
|||||||
|
|
||||||
String id = data.apply(implementationArguments, scope);
|
String id = data.apply(implementationArguments, scope);
|
||||||
|
|
||||||
|
RegistryKey.parse(id)
|
||||||
registry.get(RegistryKey.parse(id))
|
.bind(registry::getEither)
|
||||||
.consume(table -> {
|
.consume(left -> LOGGER.error("No such loot table {}", id),
|
||||||
|
table -> {
|
||||||
Vector3 apply = Vector3.of(FloatingPointFunctions.round(xz.getX()),
|
Vector3 apply = Vector3.of(FloatingPointFunctions.round(xz.getX()),
|
||||||
y.apply(implementationArguments, scope)
|
y.apply(implementationArguments, scope)
|
||||||
.intValue(),
|
.intValue(),
|
||||||
@@ -92,7 +93,7 @@ public class LootFunction implements Function<Void> {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
).ifNothing(() -> LOGGER.error("No such loot table {}", id));
|
);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
package com.dfsek.terra.api.error;
|
||||||
|
|
||||||
|
public record InvalidKey(String message) implements Invalid {
|
||||||
|
}
|
||||||
@@ -9,6 +9,7 @@ package com.dfsek.terra.api.registry;
|
|||||||
|
|
||||||
import com.dfsek.tectonic.api.loader.type.TypeLoader;
|
import com.dfsek.tectonic.api.loader.type.TypeLoader;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.error.Invalid;
|
||||||
import com.dfsek.terra.api.error.InvalidLookup;
|
import com.dfsek.terra.api.error.InvalidLookup;
|
||||||
import com.dfsek.terra.api.error.InvalidLookup.AmbiguousKey;
|
import com.dfsek.terra.api.error.InvalidLookup.AmbiguousKey;
|
||||||
import com.dfsek.terra.api.error.InvalidLookup.NoSuchElement;
|
import com.dfsek.terra.api.error.InvalidLookup.NoSuchElement;
|
||||||
@@ -41,6 +42,10 @@ public interface Registry<T> extends TypeLoader<T> {
|
|||||||
@Contract(pure = true)
|
@Contract(pure = true)
|
||||||
Maybe<T> get(@NotNull RegistryKey key);
|
Maybe<T> get(@NotNull RegistryKey key);
|
||||||
|
|
||||||
|
default Either<Invalid, T> getEither(@NotNull RegistryKey key) {
|
||||||
|
return get(key).toEither(new NoSuchElement("No such element " + key.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the registry contains a value.
|
* Check if the registry contains a value.
|
||||||
*
|
*
|
||||||
@@ -89,7 +94,7 @@ public interface Registry<T> extends TypeLoader<T> {
|
|||||||
return getType().getRawType();
|
return getType().getRawType();
|
||||||
}
|
}
|
||||||
|
|
||||||
default Either<InvalidLookup, T> getByID(String id) {
|
default Either<Invalid, T> getByID(String id) {
|
||||||
return getByID(id, map -> {
|
return getByID(id, map -> {
|
||||||
if(map.isEmpty()) return Either.left(new NoSuchElement("No such value + \"" + id + "\""));
|
if(map.isEmpty()) return Either.left(new NoSuchElement("No such value + \"" + id + "\""));
|
||||||
if(map.size() == 1) {
|
if(map.size() == 1) {
|
||||||
@@ -109,9 +114,10 @@ public interface Registry<T> extends TypeLoader<T> {
|
|||||||
|
|
||||||
Map<RegistryKey, T> getMatches(String id);
|
Map<RegistryKey, T> getMatches(String id);
|
||||||
|
|
||||||
default Either<InvalidLookup, T> getByID(String attempt, Function<Map<RegistryKey, T>, Either<InvalidLookup, T>> reduction) {
|
default Either<Invalid, T> getByID(String attempt, Function<Map<RegistryKey, T>, Either<Invalid, T>> reduction) {
|
||||||
if(attempt.contains(":")) {
|
if(attempt.contains(":")) {
|
||||||
return get(RegistryKey.parse(attempt)).toEither(new NoSuchElement("No such value + \"" + attempt + "\""));
|
return RegistryKey.parse(attempt)
|
||||||
|
.bind(this::getEither);
|
||||||
}
|
}
|
||||||
return reduction.apply(getMatches(attempt));
|
return reduction.apply(getMatches(attempt));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
package com.dfsek.terra.api.registry.key;
|
package com.dfsek.terra.api.registry.key;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.error.Invalid;
|
||||||
|
import com.dfsek.terra.api.error.InvalidKey;
|
||||||
|
import com.dfsek.terra.api.util.generic.data.types.Either;
|
||||||
|
import com.dfsek.terra.api.util.generic.data.types.Maybe;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@@ -26,14 +31,14 @@ public final class RegistryKey implements StringIdentifiable, Namespaced {
|
|||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RegistryKey parse(String key) {
|
public static Either<Invalid, RegistryKey> parse(String key) {
|
||||||
if(key.chars().filter(c -> c == ':').count() != 1) {
|
if(key.chars().filter(c -> c == ':').count() != 1) {
|
||||||
throw new IllegalArgumentException("Malformed RegistryKey: " + key);
|
return Either.left(new InvalidKey("Malformed RegistryKey: " + key));
|
||||||
}
|
}
|
||||||
String namespace = key.substring(0, key.indexOf(":"));
|
String namespace = key.substring(0, key.indexOf(":"));
|
||||||
String id = key.substring(key.indexOf(":") + 1);
|
String id = key.substring(key.indexOf(":") + 1);
|
||||||
|
|
||||||
return new RegistryKey(namespace, id);
|
return Either.right(new RegistryKey(namespace, id));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RegistryKey of(String namespace, String id) {
|
public static RegistryKey of(String namespace, String id) {
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import org.jetbrains.annotations.Contract;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
@@ -63,6 +62,16 @@ public interface Either<L, R> extends Monad<R, Either<?, ?>>, BiFunctor<L, R, Ei
|
|||||||
|
|
||||||
<U> U collect(Function<L, U> left, Function<R, U> right);
|
<U> U collect(Function<L, U> left, Function<R, U> right);
|
||||||
|
|
||||||
|
default Either<L, R> consume(Consumer<L> left, Consumer<R> right) {
|
||||||
|
return mapLeft(l -> {
|
||||||
|
left.accept(l);
|
||||||
|
return l;
|
||||||
|
}).mapRight(r -> {
|
||||||
|
right.accept(r);
|
||||||
|
return r;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("Convert2MethodRef")
|
@SuppressWarnings("Convert2MethodRef")
|
||||||
default <T extends Throwable> R collectThrow(Function<L, T> left) throws T {
|
default <T extends Throwable> R collectThrow(Function<L, T> left) throws T {
|
||||||
return mapLeft(left).collect(l -> FunctionUtils.sneakyThrow(l), Function.identity());
|
return mapLeft(left).collect(l -> FunctionUtils.sneakyThrow(l), Function.identity());
|
||||||
|
|||||||
+6
-5
@@ -104,12 +104,13 @@ public class MetaPackImpl implements MetaPack {
|
|||||||
logger.info("Loading metapack \"{}:{}\"", id, namespace);
|
logger.info("Loading metapack \"{}:{}\"", id, namespace);
|
||||||
|
|
||||||
template.getPacks().forEach((k, v) -> {
|
template.getPacks().forEach((k, v) -> {
|
||||||
RegistryKey registryKey = RegistryKey.parse(v);
|
RegistryKey.parse(v)
|
||||||
configRegistry.get(registryKey).consume(pack -> {
|
.bind(configRegistry::getEither)
|
||||||
packs.put(k, pack);
|
.consume(left -> logger.warn("Failed to link config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id),
|
||||||
|
right -> {
|
||||||
|
packs.put(k, right);
|
||||||
logger.info("Linked config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id);
|
logger.info("Linked config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id);
|
||||||
})
|
});
|
||||||
.ifNothing(() -> logger.warn("Failed to link config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
HashSet<String> authors = new HashSet<>();
|
HashSet<String> authors = new HashSet<>();
|
||||||
|
|||||||
Reference in New Issue
Block a user