|
5 | 5 | package net.minecraftforge.gradleutils; |
6 | 6 |
|
7 | 7 | import groovy.lang.Closure; |
| 8 | +import kotlin.jvm.functions.Function0; |
| 9 | +import net.minecraftforge.gradleutils.shared.Closures; |
8 | 10 | import org.gradle.api.Action; |
9 | 11 | import org.gradle.api.artifacts.repositories.MavenArtifactRepository; |
10 | 12 | import org.gradle.api.file.Directory; |
11 | 13 | import org.gradle.api.provider.Provider; |
12 | 14 | import org.gradle.api.provider.ProviderConvertible; |
13 | 15 |
|
14 | 16 | import java.io.File; |
| 17 | +import java.util.concurrent.Callable; |
| 18 | +import java.util.function.Supplier; |
15 | 19 |
|
16 | 20 | /// Contains various utilities for working with Gradle scripts. |
17 | 21 | /// |
@@ -271,33 +275,95 @@ default Action<MavenArtifactRepository> getPublishingForgeMaven(Provider<?> defa |
271 | 275 |
|
272 | 276 | /* MISCELLANEOUS */ |
273 | 277 |
|
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. |
280 | 279 | /// |
281 | 280 | /// @param value The value to unpack |
282 | 281 | /// @param <T> The type of value held by the provider |
283 | 282 | /// @return The unpacked value |
284 | | - /// @see #unpack(Provider) |
| 283 | + /// @see #unpack(Object) |
285 | 284 | default <T> T unpack(Provider<T> value) { |
286 | 285 | return value.get(); |
287 | 286 | } |
288 | 287 |
|
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. |
290 | 343 | /// |
291 | 344 | /// 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. |
295 | 347 | /// |
296 | 348 | /// @param value The value to unpack |
297 | 349 | /// @param <T> The type of value held by the provider |
298 | 350 | /// @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 | + } |
302 | 368 | } |
303 | 369 | } |
0 commit comments