Skip to content

Commit 4fb10c9

Browse files
committed
Add more unpack methods
1 parent bb1146b commit 4fb10c9

File tree

2 files changed

+97
-14
lines changed

2 files changed

+97
-14
lines changed

src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtension.java

Lines changed: 80 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@
55
package net.minecraftforge.gradleutils;
66

77
import groovy.lang.Closure;
8+
import kotlin.jvm.functions.Function0;
9+
import net.minecraftforge.gradleutils.shared.Closures;
810
import org.gradle.api.Action;
911
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
1012
import org.gradle.api.file.Directory;
1113
import org.gradle.api.provider.Provider;
1214
import org.gradle.api.provider.ProviderConvertible;
1315

1416
import java.io.File;
17+
import java.util.concurrent.Callable;
18+
import java.util.function.Supplier;
1519

1620
/// Contains various utilities for working with Gradle scripts.
1721
///
@@ -271,33 +275,95 @@ default Action<MavenArtifactRepository> getPublishingForgeMaven(Provider<?> defa
271275

272276
/* MISCELLANEOUS */
273277

274-
/// Unpacks a provider's value.
275-
///
276-
/// Since buildscripts are dynamically compiled, this allows buildscript authors to use this method with version
277-
/// catalog entries. On compilation, either this method or [#unpack(ProviderConvertible)] will be used depending on
278-
/// what the input is. This prevents the need to arbitrarily call [Provider#get()] on values which could either be a
279-
/// [Provider] or [ProviderConvertible] based on circumstance.
278+
/// Unpacks a deferred value.
280279
///
281280
/// @param value The value to unpack
282281
/// @param <T> The type of value held by the provider
283282
/// @return The unpacked value
284-
/// @see #unpack(Provider)
283+
/// @see #unpack(Object)
285284
default <T> T unpack(Provider<T> value) {
286285
return value.get();
287286
}
288287

289-
/// Unpacks a provider convertible's provided value.
288+
/// Unpacks a deferred value.
289+
///
290+
/// @param value The value to unpack
291+
/// @param <T> The type of value held by the provider
292+
/// @return The unpacked value
293+
/// @see #unpack(Object)
294+
default <T> T unpack(ProviderConvertible<T> value) {
295+
return value.asProvider().get();
296+
}
297+
298+
/// Unpacks a deferred value.
299+
///
300+
/// @param value The value to unpack
301+
/// @param <T> The type of value held by the provider
302+
/// @return The unpacked value
303+
/// @see #unpack(Object)
304+
default <T> T unpack(Closure<T> value) {
305+
return Closures.invoke(value);
306+
}
307+
308+
/// Unpacks a deferred value.
309+
///
310+
/// @param value The value to unpack
311+
/// @param <T> The type of value held by the provider
312+
/// @return The unpacked value
313+
/// @see #unpack(Object)
314+
default <T> T unpack(Callable<T> value) {
315+
try {
316+
return value.call();
317+
} catch (Exception e) {
318+
throw new RuntimeException(e);
319+
}
320+
}
321+
322+
/// Unpacks a deferred value.
323+
///
324+
/// @param value The value to unpack
325+
/// @param <T> The type of value held by the provider
326+
/// @return The unpacked value
327+
/// @see #unpack(Object)
328+
default <T> T unpack(Function0<T> value) {
329+
return value.invoke();
330+
}
331+
332+
/// Unpacks a deferred value.
333+
///
334+
/// @param value The value to unpack
335+
/// @param <T> The type of value held by the provider
336+
/// @return The unpacked value
337+
/// @see #unpack(Object)
338+
default <T> T unpack(Supplier<T> value) {
339+
return value.get();
340+
}
341+
342+
/// Unpacks a deferred value.
290343
///
291344
/// Since buildscripts are dynamically compiled, this allows buildscript authors to use this method with version
292-
/// catalog entries. On compilation, either this method or [#unpack(Provider)] will be used depending on what the
293-
/// input is. This prevents the need to arbitrarily call [ProviderConvertible#asProvider()] -> [Provider#get()] on
294-
/// values which could either be a [Provider] or [ProviderConvertible] based on circumstance.
345+
/// catalog entries, other provider-like objects. This prevents the need to arbitrarily call
346+
/// [Provider#get()] (or similar) on values which may or may not be deferred based on circumstance.
295347
///
296348
/// @param value The value to unpack
297349
/// @param <T> The type of value held by the provider
298350
/// @return The unpacked value
299-
/// @see #unpack(Provider)
300-
default <T> T unpack(ProviderConvertible<T> value) {
301-
return unpack(value.asProvider());
351+
@SuppressWarnings("unchecked")
352+
default <T> T unpack(Object value) {
353+
if (value instanceof ProviderConvertible<?> deferred) {
354+
return (T) this.unpack(deferred);
355+
} else if (value instanceof Provider<?> deferred) {
356+
return (T) this.unpack(deferred);
357+
} else if (value instanceof Closure<?> deferred) {
358+
return (T) this.unpack(deferred);
359+
} else if (value instanceof Callable<?> deferred) {
360+
return (T) this.unpack(deferred);
361+
} else if (value instanceof Function0<?> deferred) {
362+
return (T) this.unpack(deferred);
363+
} else if (value instanceof Supplier<?> deferred) {
364+
return (T) this.unpack(deferred);
365+
} else {
366+
return (T) value;
367+
}
302368
}
303369
}

src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionInternal.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
99
import org.gradle.api.reflect.HasPublicType;
1010
import org.gradle.api.reflect.TypeOf;
11+
import org.jetbrains.annotations.UnknownNullability;
12+
13+
import java.util.Objects;
1114

1215
non-sealed interface GradleUtilsExtensionInternal extends GradleUtilsExtension, HasPublicType {
1316
@Override
@@ -30,6 +33,20 @@ default TypeOf<?> getPublicType() {
3033
repo.setUrl(Constants.MC_LIBS_MAVEN);
3134
};
3235

36+
/// Unpacks a deferred value or returns `null` if the value could not be unpacked or queried.
37+
///
38+
/// @param value The value to unpack
39+
/// @param <T> The type of value held by the provider
40+
/// @return The unpacked value
41+
/// @see #unpack(Object)
42+
default <T> T unpackOrNull(@UnknownNullability Object value) {
43+
try {
44+
return this.unpack(Objects.requireNonNull(value));
45+
} catch (Throwable e) {
46+
return null;
47+
}
48+
}
49+
3350
non-sealed interface ForProject extends GradleUtilsExtensionInternal, GradleUtilsExtensionForProject, HasPublicType {
3451
@Override
3552
default TypeOf<?> getPublicType() {

0 commit comments

Comments
 (0)