fix: ignore CancellationException
in suspend functions (#1794)
* fix: ignore `CancellationException` in suspend functions Signed-off-by: Aditya Wasan <adityawasan55@gmail.com> * build(coroutine-utils): use `api` instead of `implementation` Co-authored-by: Harsh Shandilya <me@msfjarvis.dev> Co-authored-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
parent
cf3ae17b84
commit
9c9616d047
4 changed files with 57 additions and 7 deletions
|
@ -10,4 +10,5 @@ plugins {
|
|||
dependencies {
|
||||
implementation(libs.kotlin.coroutines.core)
|
||||
implementation(libs.dagger.hilt.core)
|
||||
api(libs.thirdparty.kotlinResult)
|
||||
}
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
@file:OptIn(ExperimentalContracts::class)
|
||||
@file:Suppress("RedundantSuspendModifier")
|
||||
|
||||
package dev.msfjarvis.aps.util.coroutines
|
||||
|
||||
import com.github.michaelbull.result.Err
|
||||
import com.github.michaelbull.result.Ok
|
||||
import com.github.michaelbull.result.Result
|
||||
import kotlin.contracts.ExperimentalContracts
|
||||
import kotlin.contracts.InvocationKind
|
||||
import kotlin.contracts.contract
|
||||
import kotlinx.coroutines.CancellationException
|
||||
|
||||
/**
|
||||
* Calls the specified function [block] with [this] value as its receiver and returns its
|
||||
* encapsulated result if invocation was successful, catching any [Throwable] except
|
||||
* [CancellationException] that was thrown from the [block] function execution and encapsulating it
|
||||
* as a failure.
|
||||
*/
|
||||
public suspend inline fun <V> runSuspendCatching(block: () -> V): Result<V, Throwable> {
|
||||
contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
|
||||
|
||||
return try {
|
||||
Ok(block())
|
||||
} catch (e: Throwable) {
|
||||
if (e is CancellationException) throw e
|
||||
Err(e)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls the specified function [block] with [this] value as its receiver and returns its
|
||||
* encapsulated result if invocation was successful, catching any [Throwable] except
|
||||
* [CancellationException] that was thrown from the [block] function execution and encapsulating it
|
||||
* as a failure.
|
||||
*/
|
||||
public suspend inline infix fun <T, V> T.runSuspendCatching(
|
||||
block: T.() -> V
|
||||
): Result<V, Throwable> {
|
||||
contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
|
||||
|
||||
return try {
|
||||
Ok(block())
|
||||
} catch (e: Throwable) {
|
||||
if (e is CancellationException) throw e
|
||||
Err(e)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue