diff --git a/di/src/main/java/org/panda_lang/utilities/inject/Bind.java b/di/src/main/java/org/panda_lang/utilities/inject/Bind.java index 274cdc5..0ad1000 100644 --- a/di/src/main/java/org/panda_lang/utilities/inject/Bind.java +++ b/di/src/main/java/org/panda_lang/utilities/inject/Bind.java @@ -16,7 +16,9 @@ package org.panda_lang.utilities.inject; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import panda.std.function.ThrowingSupplier; import panda.std.function.ThrowingTriFunction; import panda.std.function.TriFunction; import java.lang.annotation.Annotation; @@ -25,7 +27,7 @@ public interface Bind extends Comparable> { /** - * Assign object to the bind + * Assign an object to the bind * * @param value the instance to assign */ @@ -36,7 +38,23 @@ public interface Bind extends Comparable> { * * @param valueSupplier the supplier to assign */ - void assignInstance(Supplier valueSupplier); + void assignSupplier(Supplier valueSupplier); + + /** + * @deprecated use {@link #assignSupplier(Supplier)} instead + */ + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "2.0.0") + default void assignInstance(Supplier valueSupplier) { + this.assignSupplier(valueSupplier); + } + + /** + * Assign value supplier to the bind which can throw an exception + * + * @param valueSupplier the supplier to assign + */ + void assignThrowingSupplier(ThrowingSupplier valueSupplier); /** * Assign custom handler to the bind diff --git a/di/src/main/java/org/panda_lang/utilities/inject/DefaultBind.java b/di/src/main/java/org/panda_lang/utilities/inject/DefaultBind.java index 0b460ab..6c9b2b2 100644 --- a/di/src/main/java/org/panda_lang/utilities/inject/DefaultBind.java +++ b/di/src/main/java/org/panda_lang/utilities/inject/DefaultBind.java @@ -16,6 +16,7 @@ package org.panda_lang.utilities.inject; +import panda.std.function.ThrowingSupplier; import panda.std.function.ThrowingTriFunction; import panda.std.function.TriFunction; import panda.utilities.ObjectUtils; @@ -51,7 +52,12 @@ public void assignInstance(Object value) { } @Override - public void assignInstance(Supplier valueSupplier) { + public void assignSupplier(Supplier valueSupplier) { + with(new StaticBindValue<>(valueSupplier)); + } + + @Override + public void assignThrowingSupplier(ThrowingSupplier valueSupplier) { with(new StaticBindValue<>(valueSupplier)); } diff --git a/di/src/main/java/org/panda_lang/utilities/inject/StaticBindValue.java b/di/src/main/java/org/panda_lang/utilities/inject/StaticBindValue.java index eaefab7..e8e756e 100644 --- a/di/src/main/java/org/panda_lang/utilities/inject/StaticBindValue.java +++ b/di/src/main/java/org/panda_lang/utilities/inject/StaticBindValue.java @@ -17,22 +17,22 @@ package org.panda_lang.utilities.inject; import java.lang.annotation.Annotation; -import java.util.function.Supplier; +import panda.std.function.ThrowingSupplier; final class StaticBindValue implements BindValue { - private final Supplier valueSupplier; + private final ThrowingSupplier valueSupplier; StaticBindValue(Object value) { this(() -> value); } - StaticBindValue(Supplier valueSupplier) { + StaticBindValue(ThrowingSupplier valueSupplier) { this.valueSupplier = valueSupplier; } @Override - public Object getValue(Property required, A annotation, Object... injectorArgs) { + public Object getValue(Property required, A annotation, Object... injectorArgs) throws Exception { return valueSupplier.get(); } diff --git a/di/src/test/java/org/panda_lang/utilities/inject/DependencyInjectionHandlerTest.java b/di/src/test/java/org/panda_lang/utilities/inject/DependencyInjectionHandlerTest.java index b37481e..c068033 100644 --- a/di/src/test/java/org/panda_lang/utilities/inject/DependencyInjectionHandlerTest.java +++ b/di/src/test/java/org/panda_lang/utilities/inject/DependencyInjectionHandlerTest.java @@ -66,7 +66,7 @@ public static class Service2 { } @Test - void shouldNotCreateInstance() { + void shouldNotCreateInstanceAndFail() { Injector injector = DependencyInjection.createInjector(resources -> { resources.on(String.class).assignThrowingHandler((type, annotation, args) -> { throw new Exception("Failed"); diff --git a/di/src/test/java/org/panda_lang/utilities/inject/DependencyInjectionInstancesTest.java b/di/src/test/java/org/panda_lang/utilities/inject/DependencyInjectionInstancesTest.java index f68033f..13084e8 100644 --- a/di/src/test/java/org/panda_lang/utilities/inject/DependencyInjectionInstancesTest.java +++ b/di/src/test/java/org/panda_lang/utilities/inject/DependencyInjectionInstancesTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; final class DependencyInjectionInstancesTest { @@ -13,12 +14,26 @@ void shouldInjectInstances() { // some logic, a few hours later... injector.getResources().on(Custom.class).assignInstance(new CustomImpl()); // singleton - injector.getResources().on(Bean.class).assignInstance(Bean::new); // new instance per call + injector.getResources().on(Bean.class).assignSupplier(Bean::new); // new instance per call Service service = injector.newInstance(Service.class); assertNotNull(service); } + @Test + void shouldNotInjectInstances() { + Injector injector = DependencyInjection.createInjector(resources -> { + resources.on(Custom.class).assignThrowingSupplier(() -> { + throw new Exception("Failed"); + }); + resources.on(Bean.class).assignThrowingSupplier(() -> { + throw new Exception("Failed"); + }); + }); + + assertThrows(DependencyInjectionException.class, () -> injector.newInstance(Service.class)); + } + public static class Bean { } public interface Custom { }