parent
f236e2674b
commit
3b87373b23
@ -105,3 +105,45 @@ public inline fun <V, E> Result<V, E>.recoverUnless(predicate: (E) -> Boolean, t
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws the [error][Err.error] if this [Result] is an [Err]
|
||||||
|
* and satisfies the given [predicate], otherwise this [Result].
|
||||||
|
*
|
||||||
|
* @see [takeIf]
|
||||||
|
*/
|
||||||
|
public inline fun <V, E : Throwable> Result<V, E>.throwIf(predicate: (E) -> Boolean): Result<V, E> {
|
||||||
|
contract {
|
||||||
|
callsInPlace(predicate, InvocationKind.AT_MOST_ONCE)
|
||||||
|
}
|
||||||
|
|
||||||
|
return when (this) {
|
||||||
|
is Ok -> this
|
||||||
|
is Err -> if (predicate(error)) {
|
||||||
|
throw error
|
||||||
|
} else {
|
||||||
|
this
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws the [error][Err.error] if this [Result] is an [Err]
|
||||||
|
* and _does not_ satisfy the given [predicate], otherwise this [Result].
|
||||||
|
*
|
||||||
|
* @see [takeUnless]
|
||||||
|
*/
|
||||||
|
public inline fun <V, E : Throwable> Result<V, E>.throwUnless(predicate: (E) -> Boolean): Result<V, E> {
|
||||||
|
contract {
|
||||||
|
callsInPlace(predicate, InvocationKind.AT_MOST_ONCE)
|
||||||
|
}
|
||||||
|
|
||||||
|
return when (this) {
|
||||||
|
is Ok -> this
|
||||||
|
is Err -> if (!predicate(error)) {
|
||||||
|
throw error
|
||||||
|
} else {
|
||||||
|
this
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -181,4 +181,62 @@ class OrTest {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ThrowIf {
|
||||||
|
@Test
|
||||||
|
fun returnsValueIfOk() {
|
||||||
|
assertEquals(
|
||||||
|
expected = Ok(200),
|
||||||
|
actual = Ok(200).throwIf { true }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun returnsErrIfPredicateDoesNotMatch() {
|
||||||
|
val error = RuntimeException("throw if")
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
expected = Err(error),
|
||||||
|
actual = Err(error).throwIf { false }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun throwsErrIfPredicateMatches() {
|
||||||
|
val error = RuntimeException("throw if")
|
||||||
|
|
||||||
|
assertFailsWith<RuntimeException>(error.message) {
|
||||||
|
Err(error).throwIf { true }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ThrowUnless {
|
||||||
|
@Test
|
||||||
|
fun returnsValueIfOk() {
|
||||||
|
assertEquals(
|
||||||
|
expected = Ok(500),
|
||||||
|
actual = Ok(500).throwUnless { false }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun returnsErrIfPredicateMatches() {
|
||||||
|
val error = RuntimeException("example")
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
expected = Err(error),
|
||||||
|
actual = Err(error).throwUnless { true }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun throwsErrIfPredicateDoesNotMatch() {
|
||||||
|
val error = RuntimeException("throw unless")
|
||||||
|
|
||||||
|
assertFailsWith<RuntimeException>(error.message) {
|
||||||
|
Err(error).throwUnless { false }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user