diff --git a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/config/ReplaceableBiomeLoader.java b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/config/ReplaceableBiomeLoader.java index 79bd46e21..7c7787740 100644 --- a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/config/ReplaceableBiomeLoader.java +++ b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/config/ReplaceableBiomeLoader.java @@ -27,6 +27,6 @@ public class ReplaceableBiomeLoader implements TypeLoader { return biomeRegistry .getByID((String) c) .map(ReplaceableBiome::of) - .orElseThrow(() -> new LoadException("No such biome: " + c, depthTracker)); + .collectThrow(left -> new LoadException("No such biome: " + c + ": " + left, depthTracker)); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java index afd249c25..80e6d26c9 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java @@ -7,6 +7,7 @@ import com.dfsek.tectonic.api.loader.type.TypeLoader; import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; +import java.util.function.Function; import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.registry.Registry; @@ -27,6 +28,6 @@ public class PipelineBiomeLoader implements TypeLoader { return biomeRegistry .getByID((String) c) .map(PipelineBiome::from) - .orElseGet(() -> PipelineBiome.placeholder((String) c)); + .collect(left -> PipelineBiome.placeholder((String) c), Function.identity()); } } diff --git a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java index 11a62ee52..aede6dd22 100644 --- a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java +++ b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java @@ -41,7 +41,7 @@ public class LocateCommandAddon implements AddonInitializer { private BaseAddon addon; private static Registry getBiomeRegistry(CommandContext sender) { - return sender.sender().getEntity().orElseThrow().world().getPack().getRegistry(Biome.class); + return sender.sender().getEntity().orThrow().world().getPack().getRegistry(Biome.class); } @Override @@ -69,7 +69,7 @@ public class LocateCommandAddon implements AddonInitializer { .handler(context -> { // 1. Gather Context & Arguments Biome targetBiome = context.get("biome"); - Entity sender = context.sender().getEntity().orElseThrow( + Entity sender = context.sender().getEntity().orThrow( () -> new Error("Only entities can run this command.")); World world = sender.world(); diff --git a/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java b/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java index 0ec8f3891..9e60e90bc 100644 --- a/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java +++ b/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java @@ -34,7 +34,7 @@ public class StructureCommandAddon implements AddonInitializer { private BaseAddon addon; private static Registry getStructureRegistry(CommandContext sender) { - return sender.sender().getEntity().orElseThrow().world().getPack().getRegistry(Structure.class); + return sender.sender().getEntity().orThrow().world().getPack().getRegistry(Structure.class); } @Override @@ -55,7 +55,7 @@ public class StructureCommandAddon implements AddonInitializer { .optional("rotation", EnumParser.enumParser(Rotation.class), DefaultValue.constant(Rotation.NONE)) .handler(context -> { Structure structure = context.get("structure"); - Entity sender = context.sender().getEntity().orElseThrow(); + Entity sender = context.sender().getEntity().orThrow(); structure.generate( sender.position().toInt(), sender.world(), diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java index 5176116f8..5fcf23ad1 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java @@ -64,7 +64,7 @@ public class LootFunction implements Function { registry.get(RegistryKey.parse(id)) - .ifPresentOrElse(table -> { + .consume(table -> { Vector3 apply = Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope) .intValue(), @@ -91,8 +91,8 @@ public class LootFunction implements Function { LOGGER.error("Could not apply loot at {}", apply, e); e.printStackTrace(); } - }, - () -> LOGGER.error("No such loot table {}", id)); + } + ).ifNothing(() -> LOGGER.error("No such loot table {}", id)); return null; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java index 4fe8b45af..2660421f5 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java @@ -91,10 +91,10 @@ public class StructureFunction implements Function { FloatingPointFunctions.round(xz.getZ())), arguments.getRandom(), arguments.getRotation().rotate(rotation1)); - }).orElseGet(() -> { + }).collect(left -> { LOGGER.error("No such structure {}", app); return false; - }); + }, java.util.function.Function.identity()); } @Override diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java b/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java index 9755c2005..9172270ec 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java @@ -7,17 +7,16 @@ package com.dfsek.terra.api.command; -import java.util.Optional; - import com.dfsek.terra.api.Handle; import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.Player; +import com.dfsek.terra.api.util.generic.data.types.Maybe; public interface CommandSender extends Handle { void sendMessage(String message); - Optional getEntity(); + Maybe getEntity(); - Optional getPlayer(); + Maybe getPlayer(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java index 8e15c18ce..735b533a4 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java @@ -1,5 +1,7 @@ package com.dfsek.terra.api.command.arguments; +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import io.leangen.geantyref.TypeToken; import org.checkerframework.checker.nullness.qual.NonNull; import org.incendo.cloud.component.CommandComponent; @@ -100,20 +102,16 @@ public class RegistryArgument { Registry registry = registryFunction.apply(commandContext); - Optional result; - try { - result = registry.get(RegistryKey.parse(input)); - } catch(IllegalArgumentException e) { - try { - result = registry.getByID(input); - } catch(IllegalArgumentException e1) { - return ArgumentParseResult.failure(e1); - } - } - - return result + String finalInput = input; + return registry.get(RegistryKey.parse(input)) .map(ArgumentParseResult::success) - .orElse(ArgumentParseResult.failure(new NoSuchEntryException("No such entry: " + input))); + .orJust(() -> + registry.getByID(finalInput).collect( + left -> ArgumentParseResult.failure(new IllegalArgumentException(left)), + ArgumentParseResult::success + )) + .get(() -> ArgumentParseResult.failure(new NoSuchEntryException("No such entry: " + finalInput))); + } @Override diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java index a034214fb..432d29612 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java @@ -8,6 +8,10 @@ package com.dfsek.terra.api.registry; import com.dfsek.tectonic.api.loader.type.TypeLoader; + +import com.dfsek.terra.api.util.generic.data.types.Either; +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -32,7 +36,7 @@ public interface Registry extends TypeLoader { * @return Value matching the identifier, {@code null} if no value is present. */ @Contract(pure = true) - Optional get(@NotNull RegistryKey key); + Maybe get(@NotNull RegistryKey key); /** * Check if the registry contains a value. @@ -82,13 +86,13 @@ public interface Registry extends TypeLoader { return getType().getRawType(); } - default Optional getByID(String id) { + default Either getByID(String id) { return getByID(id, map -> { - if(map.isEmpty()) return Optional.empty(); + if(map.isEmpty()) return Either.left("No such element."); if(map.size() == 1) { - return map.values().stream().findFirst(); // only one value. + return Either.right(map.values().stream().findFirst().get()); // only one value. } - throw new IllegalArgumentException("ID \"" + id + "\" is ambiguous; matches: " + map + return Either.left("ID \"" + id + "\" is ambiguous; matches: " + map .keySet() .stream() .map(RegistryKey::toString) @@ -102,9 +106,9 @@ public interface Registry extends TypeLoader { Map getMatches(String id); - default Optional getByID(String attempt, Function, Optional> reduction) { + default Either getByID(String attempt, Function, Either> reduction) { if(attempt.contains(":")) { - return get(RegistryKey.parse(attempt)); + return get(RegistryKey.parse(attempt)).toEither("No such value."); } return reduction.apply(getMatches(attempt)); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java index 8a36eca81..1961c754d 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java @@ -26,6 +26,15 @@ public final class FunctionUtils { return either.collect(Function.identity(), Function.identity()); } + public static U throw_(T e) throws T { + throw e; + } + + @SuppressWarnings("unchecked") + public static U sneakyThrow(Throwable e) throws E { + throw (E) e; + } + public static Function> liftTry(Function f) { return s -> { try { diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java index 4e01be3b8..3058f68be 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java @@ -51,9 +51,9 @@ public interface Either extends Monad>, BiFunctor Either mapRight(Function f); - Optional getLeft(); + Maybe getLeft(); - Optional getRight(); + Maybe getRight(); boolean isLeft(); @@ -63,6 +63,11 @@ public interface Either extends Monad>, BiFunctor U collect(Function left, Function right); + @SuppressWarnings("Convert2MethodRef") + default R collectThrow(Function left) throws T{ + return mapLeft(left).collect(l -> FunctionUtils.sneakyThrow(l), Function.identity()); + } + @SuppressWarnings({ "unchecked" }) @NotNull @Contract("_ -> new") @@ -87,13 +92,13 @@ public interface Either extends Monad>, BiFunctor getLeft() { - return Optional.of(value); + public Maybe getLeft() { + return Maybe.just(value); } @Override - public Optional getRight() { - return Optional.empty(); + public Maybe getRight() { + return Maybe.nothing(); } @Override @@ -142,13 +147,13 @@ public interface Either extends Monad>, BiFunctor getLeft() { - return Optional.empty(); + public Maybe getLeft() { + return Maybe.nothing(); } @Override - public Optional getRight() { - return Optional.of(value); + public Maybe getRight() { + return Maybe.just(value); } @Override diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java index 72e09d119..3b7ecfb63 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java @@ -2,7 +2,9 @@ package com.dfsek.terra.api.util.generic.data.types; import com.dfsek.terra.api.util.generic.control.Monad; +import java.util.NoSuchElementException; import java.util.Optional; +import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; @@ -21,6 +23,7 @@ public interface Maybe extends Monad> { Optional toOptional(); Either toEither(L l); + T get(Supplier def); boolean isJust(); @@ -32,12 +35,45 @@ public interface Maybe extends Monad> { return get(() -> def); } + default Maybe consume(Consumer c) { + return map(m -> { + c.accept(m); + return m; + }); + } + + default Maybe ifNothing(Runnable r) { + if(!isJust()) { + r.run(); + } + return this; + } + default Maybe overwrite(Maybe m) { return bind(ignore -> m); } Maybe or(Supplier> or); + default Maybe orJust(Supplier or) { + return or(() -> just(or.get())); + } + + + @Deprecated + default T orThrow() { + return get(() -> { throw new NoSuchElementException("No value present."); }); + } + + @Deprecated + default T orThrow(Supplier e) throws X { + if(isJust()) { + return orThrow(); + } + throw e.get(); + } + + default Maybe or(Maybe or) { return or(() -> or); } @@ -54,6 +90,11 @@ public interface Maybe extends Monad> { return op.map(Maybe::just).orElseGet(Maybe::nothing); } + static Maybe ofNullable(T t) { + if(t == null) return nothing(); + return just(t); + } + static Maybe just(T1 t) { record Just(T value) implements Maybe { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java index 5a23e54b8..9ae3e3d61 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java @@ -23,10 +23,14 @@ import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.ConfigLoader; import com.dfsek.tectonic.api.loader.type.TypeLoader; import com.dfsek.tectonic.impl.MapConfiguration; + +import com.dfsek.terra.api.util.function.FunctionUtils; + import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; import java.util.Map; +import java.util.function.Function; import java.util.function.Supplier; import com.dfsek.terra.api.registry.Registry; @@ -46,7 +50,7 @@ public class GenericTemplateSupplierLoader implements TypeLoader { String type = (String) map.get("type"); return loader .load(registry.getByID(type) - .orElseThrow(() -> new LoadException("No such entry: " + map.get("type"), depthTracker)) + .collect(left -> FunctionUtils.throw_(new LoadException("Failed to load entry " + map.get("type") + ": " + left, depthTracker)), Function.identity()) .get(), new MapConfiguration(map), depthTracker.intrinsic("With type \"" + type + "\"")).get(); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java index 8ae68c8e8..685708698 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java @@ -105,12 +105,11 @@ public class MetaPackImpl implements MetaPack { template.getPacks().forEach((k, v) -> { RegistryKey registryKey = RegistryKey.parse(v); - if(configRegistry.contains(registryKey)) { - packs.put(k, configRegistry.get(registryKey).get()); - logger.info("Linked config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id); - } else { - logger.warn("Failed to link config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id); - } + configRegistry.get(registryKey).consume(pack -> { + packs.put(k, pack); + logger.info("Linked config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id); + }) + .ifNothing(() -> logger.warn("Failed to link config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id)); }); HashSet authors = new HashSet<>(); diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java index 52b22e634..f09d01593 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java @@ -20,6 +20,9 @@ package com.dfsek.terra.registry; import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.ConfigLoader; + +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import org.jetbrains.annotations.ApiStatus.Internal; import org.jetbrains.annotations.NotNull; @@ -61,7 +64,7 @@ public class CheckedRegistryImpl implements CheckedRegistry { } @Override - public Optional get(@NotNull RegistryKey key) { + public Maybe get(@NotNull RegistryKey key) { return registry.get(key); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java index 153f3792a..77c9aeaea 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java @@ -20,6 +20,9 @@ package com.dfsek.terra.registry; import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.ConfigLoader; + +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; @@ -48,7 +51,7 @@ public class LockedRegistryImpl implements Registry { } @Override - public Optional get(@NotNull RegistryKey key) { + public Maybe get(@NotNull RegistryKey key) { return registry.get(key); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java index 60bea757e..1adeaac07 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java @@ -20,6 +20,10 @@ package com.dfsek.terra.registry; import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.ConfigLoader; + +import com.dfsek.terra.api.util.function.FunctionUtils; +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimaps; import org.jetbrains.annotations.NotNull; @@ -35,6 +39,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; import com.dfsek.terra.api.registry.OpenRegistry; @@ -68,9 +73,11 @@ public class OpenRegistryImpl implements OpenRegistry { @Override public T load(@NotNull AnnotatedType type, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException { - return getByID((String) o).orElseThrow(() -> new LoadException("No such " + type.getType().getTypeName() + " matching \"" + o + - "\" was found in this registry. Registry contains items: " + - getItemsFormatted(), depthTracker)); + return getByID((String) o) + .collect(left -> FunctionUtils.throw_(new LoadException("Unable to retrieve " + type.getType().getTypeName() + " matching \"" + o + + "\" was found in this registry. Registry contains items: " + + getItemsFormatted() + "\n\nError:" + left, depthTracker)), + Function.identity()); } private String getItemsFormatted() { @@ -112,8 +119,8 @@ public class OpenRegistryImpl implements OpenRegistry { @SuppressWarnings("unchecked") @Override - public Optional get(@NotNull RegistryKey key) { - return Optional.ofNullable(objects.getOrDefault(key, (Entry) NULL).getValue()); + public Maybe get(@NotNull RegistryKey key) { + return Maybe.ofNullable(objects.getOrDefault(key, (Entry) NULL).getValue()); } @Override diff --git a/common/implementation/base/src/test/java/registry/RegistryTest.java b/common/implementation/base/src/test/java/registry/RegistryTest.java index 4ea1326fe..ee4d9d050 100644 --- a/common/implementation/base/src/test/java/registry/RegistryTest.java +++ b/common/implementation/base/src/test/java/registry/RegistryTest.java @@ -17,6 +17,8 @@ package registry; +import com.dfsek.terra.api.util.generic.data.types.Either; + import org.junit.jupiter.api.Test; import com.dfsek.terra.api.registry.CheckedRegistry; @@ -37,7 +39,7 @@ public class RegistryTest { test.register(RegistryKey.parse("test:test"), "bazinga"); - assertEquals(test.get(RegistryKey.parse("test:test")).orElseThrow(), "bazinga"); + assertEquals(test.get(RegistryKey.parse("test:test")).orThrow(), "bazinga"); } @Test @@ -60,7 +62,7 @@ public class RegistryTest { test.register(RegistryKey.parse("test:test"), "bazinga"); - assertEquals(test.get(RegistryKey.parse("test:test")).orElseThrow(), "bazinga"); + assertEquals(test.get(RegistryKey.parse("test:test")).orThrow(), "bazinga"); try { test.register(RegistryKey.parse("test:test"), "bazinga2"); @@ -76,7 +78,7 @@ public class RegistryTest { test.register(RegistryKey.parse("test:test"), "bazinga"); - assertEquals(test.getByID("test").orElseThrow(), "bazinga"); + assertEquals(test.getByID("test").collectThrow(RuntimeException::new), "bazinga"); } @Test @@ -86,11 +88,8 @@ public class RegistryTest { test.registerChecked(RegistryKey.parse("test:test"), "bazinga"); test.registerChecked(RegistryKey.parse("test2:test"), "bazinga"); - try { - test.getByID("test"); - fail("Shouldn't be able to get with ambiguous ID!"); - } catch(IllegalArgumentException ignore) { + Either result = test.getByID("test"); + assertTrue(result.isLeft()); - } } } diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/AllayPlatform.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/AllayPlatform.java index f9cb5831f..4d2e545a5 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/AllayPlatform.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/AllayPlatform.java @@ -42,7 +42,7 @@ public class AllayPlatform extends AbstractPlatform { boolean succeed = loadConfigPacks(); GENERATOR_WRAPPERS.forEach(wrapper -> { - getConfigRegistry().get(wrapper.getConfigPack().getRegistryKey()).ifPresent(pack -> { + getConfigRegistry().get(wrapper.getConfigPack().getRegistryKey()).consume(pack -> { wrapper.setConfigPack(pack); var dimension = wrapper.getAllayWorldGenerator().getDimension(); TerraAllayPlugin.instance.getPluginLogger().info( diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/generator/AllayGeneratorWrapper.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/generator/AllayGeneratorWrapper.java index 9ffc029f7..1fe968d96 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/generator/AllayGeneratorWrapper.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/generator/AllayGeneratorWrapper.java @@ -1,5 +1,7 @@ package com.dfsek.terra.allay.generator; +import com.dfsek.terra.api.util.function.FunctionUtils; + import com.google.common.base.Preconditions; import org.allaymc.api.utils.AllayStringUtils; import org.allaymc.api.world.biome.BiomeType; @@ -24,6 +26,8 @@ import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; import com.dfsek.terra.api.world.chunk.generation.util.GeneratorWrapper; import com.dfsek.terra.api.world.info.WorldProperties; +import java.util.function.Function; + /** * @author daoge_cmd @@ -91,14 +95,16 @@ public class AllayGeneratorWrapper implements GeneratorWrapper { return TerraAllayPlugin.platform .getConfigRegistry() .getByID(packId) - .orElseThrow(() -> new IllegalArgumentException("Cant find terra config pack named " + packId)); + .collectThrow( + left -> new IllegalArgumentException("Cant find terra config pack named " + packId + ": " + left)); } protected static ConfigPack getConfigPackByMeta(String metaPackId, DimensionInfo dimensionInfo) { return TerraAllayPlugin.platform .getMetaConfigRegistry() .getByID(metaPackId) - .orElseThrow(() -> new IllegalArgumentException("Cant find terra meta pack named " + metaPackId)) + .collectThrow( + left -> new IllegalArgumentException("Cant find terra meta pack named " + metaPackId + ": " + left)) .packs() .get(Mapping.dimensionIdBeToJe(dimensionInfo.toString())); } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java index 0160180a9..a4077eacc 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java @@ -1,5 +1,7 @@ package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import io.papermc.paper.command.brigadier.CommandSourceStack; import org.bukkit.ChatColor; @@ -24,19 +26,19 @@ public class CloudCommandSender implements CommandSender { } @Override - public Optional getEntity() { + public Maybe getEntity() { if(delegate instanceof org.bukkit.entity.Entity entity) { - return Optional.of(BukkitAdapter.adapt(entity)); + return Maybe.just(BukkitAdapter.adapt(entity)); } - return Optional.empty(); + return Maybe.nothing(); } @Override - public Optional getPlayer() { + public Maybe getPlayer() { if(delegate instanceof org.bukkit.entity.Player player) { - return Optional.of(BukkitAdapter.adapt(player)); + return Maybe.just(BukkitAdapter.adapt(player)); } - return Optional.empty(); + return Maybe.nothing(); } @Override diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java index 84efbc0cf..87ee04c6b 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java @@ -73,7 +73,7 @@ public class PlatformImpl extends AbstractPlatform { Bukkit.getWorlds().forEach(world -> { if(world.getGenerator() instanceof BukkitChunkGeneratorWrapper wrapper) { - getConfigRegistry().get(wrapper.getPack().getRegistryKey()).ifPresent(pack -> { + getConfigRegistry().get(wrapper.getPack().getRegistryKey()).consume(pack -> { wrapper.setPack(pack); LOGGER.info("Replaced pack in chunk generator for world {}", world); }); diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index fe18d290d..d019da7cd 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -182,10 +182,10 @@ public class TerraBukkitPlugin extends JavaPlugin { ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, String id) { if(id == null || id.trim().isEmpty()) { return null; } return new BukkitChunkGeneratorWrapper(generatorMap.computeIfAbsent(worldName, name -> { - ConfigPack pack = platform.getConfigRegistry().getByID(id).orElseThrow( - () -> new IllegalArgumentException("No such config pack \"" + id + "\"")); + ConfigPack pack = platform.getConfigRegistry().getByID(id).collectThrow( + left -> new IllegalArgumentException("No such config pack \"" + id + "\": " + left)); return pack.getGeneratorProvider().newInstance(pack); - }), platform.getRawConfigRegistry().getByID(id).orElseThrow(), platform.getWorldHandle().air()); + }), platform.getRawConfigRegistry().getByID(id).collectThrow(RuntimeException::new), platform.getWorldHandle().air()); } public AsyncScheduler getAsyncScheduler() { diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java index 5cb6ab4e6..aa348614d 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java @@ -80,7 +80,7 @@ public class CommonListener implements Listener { return; } - ConfigPack pack = platform.getConfigRegistry().get(wrapper.getPack().getRegistryKey()).orElse(null); + ConfigPack pack = platform.getConfigRegistry().get(wrapper.getPack().getRegistryKey()).get((ConfigPack) null); if(pack == null) { return; } diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java index c271f98cf..5463d44fd 100644 --- a/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java @@ -51,7 +51,7 @@ public final class TerraCLI implements Callable { CLIPlatform platform = new CLIPlatform(); platform.getEventManager().callEvent(new PlatformInitializationEvent()); - ConfigPack generate = platform.getConfigRegistry().getByID(pack).orElseThrow(); + ConfigPack generate = platform.getConfigRegistry().getByID(pack).collectThrow(RuntimeException::new); CLIWorld world = new CLIWorld(size, seed, maxHeight, minHeight, generate, noSave); diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java index 810426f83..c93616731 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java @@ -95,7 +95,7 @@ public final class TerraMinestomPlatform extends AbstractPlatform { MinecraftServer.getInstanceManager().getInstances().forEach(world -> { if(world.generator() instanceof MinestomChunkGeneratorWrapper wrapper) { - getConfigRegistry().get(wrapper.getPack().getRegistryKey()).ifPresent(pack -> { + getConfigRegistry().get(wrapper.getPack().getRegistryKey()).consume(pack -> { wrapper.setPack(pack); LOGGER.info("Replaced pack in chunk generator for instance {}", world.getUuid()); }); diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java index 337276839..19412a195 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java @@ -39,14 +39,14 @@ public class TerraMinestomWorldBuilder { } public TerraMinestomWorldBuilder packById(String id) { - this.pack = platform.getConfigRegistry().getByID(id).orElseThrow(); + this.pack = platform.getConfigRegistry().getByID(id).collectThrow(RuntimeException::new); return this; } public TerraMinestomWorldBuilder packByMeta(String metaPack, RegistryKey<@NonNull DimensionType> dimensionType) { this.pack = platform.getMetaConfigRegistry() .getByID(metaPack) - .orElseThrow(() -> new RuntimeException("MetaPack " + metaPack + " could not be found")) + .collectThrow(left -> new RuntimeException("MetaPack " + metaPack + " could not be found: " + left)) .packs() .get(dimensionType.key().asString()); return this; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java index 8cdc42c6b..b1dc66b17 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java @@ -31,7 +31,7 @@ public final class Codecs { .apply(config, config.stable(id -> CommonPlatform.get() .getConfigRegistry() .get(id) - .orElseThrow(() -> new IllegalArgumentException( + .orThrow(() -> new IllegalArgumentException( "No such config pack " + id))))); diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java index 5f9d6a651..5319fc86c 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java @@ -92,7 +92,7 @@ public abstract class LifecyclePlatform extends ModPlatform { }).join(); server.getWorlds().forEach(world -> { if(world.getChunkManager().getChunkGenerator() instanceof MinecraftChunkGeneratorWrapper chunkGeneratorWrapper) { - getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).ifPresent(pack -> { + getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).consume(pack -> { chunkGeneratorWrapper.setPack(pack); LOGGER.info("Replaced pack in chunk generator for world {}", world); });