mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-11 09:58:03 +08:00
Extract utils into multiple files
This commit is contained in:
parent
1b80fbc1e6
commit
41733e23ef
153
mirai-core-utils/src/commonMain/kotlin/ResultExtensions.kt
Normal file
153
mirai-core-utils/src/commonMain/kotlin/ResultExtensions.kt
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2021 Mamoe Technologies and contributors.
|
||||||
|
*
|
||||||
|
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
|
||||||
|
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
|
||||||
|
*
|
||||||
|
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@file:JvmMultifileClass
|
||||||
|
@file:JvmName("MiraiUtils")
|
||||||
|
|
||||||
|
package net.mamoe.mirai.utils
|
||||||
|
|
||||||
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
|
|
||||||
|
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "RESULT_CLASS_IN_RETURN_TYPE")
|
||||||
|
@kotlin.internal.InlineOnly
|
||||||
|
@kotlin.internal.LowPriorityInOverloadResolution
|
||||||
|
public inline fun <R, T : R> Result<T>.recoverCatchingSuppressed(transform: (exception: Throwable) -> R): Result<R> {
|
||||||
|
return when (val exception = exceptionOrNull()) {
|
||||||
|
null -> this
|
||||||
|
else -> {
|
||||||
|
try {
|
||||||
|
Result.success(transform(exception))
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
e.addSuppressed(exception)
|
||||||
|
Result.failure(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "RESULT_CLASS_IN_RETURN_TYPE")
|
||||||
|
@kotlin.internal.InlineOnly
|
||||||
|
@kotlin.internal.LowPriorityInOverloadResolution
|
||||||
|
public inline fun <R> retryCatching(
|
||||||
|
n: Int,
|
||||||
|
except: KClass<out Throwable>? = null,
|
||||||
|
block: (count: Int, lastException: Throwable?) -> R,
|
||||||
|
): Result<R> {
|
||||||
|
require(n >= 0) {
|
||||||
|
"param n for retryCatching must not be negative"
|
||||||
|
}
|
||||||
|
var exception: Throwable? = null
|
||||||
|
repeat(n) {
|
||||||
|
try {
|
||||||
|
return Result.success(block(it, exception))
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
if (except?.isInstance(e) == true) {
|
||||||
|
return Result.failure(e)
|
||||||
|
}
|
||||||
|
exception?.addSuppressed(e)
|
||||||
|
exception = e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Result.failure(exception!!)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "RESULT_CLASS_IN_RETURN_TYPE")
|
||||||
|
@kotlin.internal.InlineOnly
|
||||||
|
@kotlin.internal.LowPriorityInOverloadResolution
|
||||||
|
public inline fun <R> retryCatchingExceptions(
|
||||||
|
n: Int,
|
||||||
|
except: KClass<out Exception>? = null,
|
||||||
|
block: (count: Int, lastException: Throwable?) -> R,
|
||||||
|
): Result<R> {
|
||||||
|
require(n >= 0) {
|
||||||
|
"param n for retryCatching must not be negative"
|
||||||
|
}
|
||||||
|
var exception: Throwable? = null
|
||||||
|
repeat(n) {
|
||||||
|
try {
|
||||||
|
return Result.success(block(it, exception))
|
||||||
|
} catch (e: Exception) {
|
||||||
|
if (except?.isInstance(e) == true) {
|
||||||
|
return Result.failure(e)
|
||||||
|
}
|
||||||
|
exception?.addSuppressed(e)
|
||||||
|
exception = e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Result.failure(exception!!)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "RESULT_CLASS_IN_RETURN_TYPE")
|
||||||
|
@kotlin.internal.InlineOnly
|
||||||
|
public inline fun <R> retryCatching(
|
||||||
|
n: Int,
|
||||||
|
except: KClass<out Throwable>? = null,
|
||||||
|
block: () -> R,
|
||||||
|
): Result<R> {
|
||||||
|
require(n >= 0) {
|
||||||
|
"param n for retryCatching must not be negative"
|
||||||
|
}
|
||||||
|
var exception: Throwable? = null
|
||||||
|
repeat(n) {
|
||||||
|
try {
|
||||||
|
return Result.success(block())
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
if (except?.isInstance(e) == true) {
|
||||||
|
return Result.failure(e)
|
||||||
|
}
|
||||||
|
exception?.addSuppressed(e)
|
||||||
|
exception = e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Result.failure(exception!!)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "RESULT_CLASS_IN_RETURN_TYPE")
|
||||||
|
@kotlin.internal.InlineOnly
|
||||||
|
public inline fun <R> retryCatchingExceptions(
|
||||||
|
n: Int,
|
||||||
|
except: KClass<out Exception>? = null,
|
||||||
|
block: () -> R,
|
||||||
|
): Result<R> {
|
||||||
|
require(n >= 0) {
|
||||||
|
"param n for retryCatching must not be negative"
|
||||||
|
}
|
||||||
|
var exception: Throwable? = null
|
||||||
|
repeat(n) {
|
||||||
|
try {
|
||||||
|
return Result.success(block())
|
||||||
|
} catch (e: Exception) {
|
||||||
|
if (except?.isInstance(e) == true) {
|
||||||
|
return Result.failure(e)
|
||||||
|
}
|
||||||
|
exception?.addSuppressed(e)
|
||||||
|
exception = e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Result.failure(exception!!)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "RESULT_CLASS_IN_RETURN_TYPE")
|
||||||
|
@kotlin.internal.InlineOnly
|
||||||
|
public inline fun <R> runCatchingExceptions(block: () -> R): Result<R> {
|
||||||
|
return try {
|
||||||
|
Result.success(block())
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Result.failure(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public inline fun <R> Result<R>.mapFailure(
|
||||||
|
block: (Throwable) -> Throwable,
|
||||||
|
): Result<R> = onFailure {
|
||||||
|
return Result.failure(block(it))
|
||||||
|
}
|
@ -15,7 +15,6 @@ package net.mamoe.mirai.utils
|
|||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.contracts.InvocationKind
|
import kotlin.contracts.InvocationKind
|
||||||
import kotlin.contracts.contract
|
import kotlin.contracts.contract
|
||||||
import kotlin.reflect.KClass
|
|
||||||
|
|
||||||
public inline fun <reified T> Any?.cast(): T {
|
public inline fun <reified T> Any?.cast(): T {
|
||||||
contract { returns() implies (this@cast is T) }
|
contract { returns() implies (this@cast is T) }
|
||||||
@ -44,136 +43,6 @@ public inline fun <reified R> Iterable<*>.firstIsInstanceOrNull(): R? {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "RESULT_CLASS_IN_RETURN_TYPE")
|
|
||||||
@kotlin.internal.InlineOnly
|
|
||||||
@kotlin.internal.LowPriorityInOverloadResolution
|
|
||||||
public inline fun <R, T : R> Result<T>.recoverCatchingSuppressed(transform: (exception: Throwable) -> R): Result<R> {
|
|
||||||
return when (val exception = exceptionOrNull()) {
|
|
||||||
null -> this
|
|
||||||
else -> {
|
|
||||||
try {
|
|
||||||
Result.success(transform(exception))
|
|
||||||
} catch (e: Throwable) {
|
|
||||||
e.addSuppressed(exception)
|
|
||||||
Result.failure(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "RESULT_CLASS_IN_RETURN_TYPE")
|
|
||||||
@kotlin.internal.InlineOnly
|
|
||||||
@kotlin.internal.LowPriorityInOverloadResolution
|
|
||||||
public inline fun <R> retryCatching(
|
|
||||||
n: Int,
|
|
||||||
except: KClass<out Throwable>? = null,
|
|
||||||
block: (count: Int, lastException: Throwable?) -> R
|
|
||||||
): Result<R> {
|
|
||||||
require(n >= 0) {
|
|
||||||
"param n for retryCatching must not be negative"
|
|
||||||
}
|
|
||||||
var exception: Throwable? = null
|
|
||||||
repeat(n) {
|
|
||||||
try {
|
|
||||||
return Result.success(block(it, exception))
|
|
||||||
} catch (e: Throwable) {
|
|
||||||
if (except?.isInstance(e) == true) {
|
|
||||||
return Result.failure(e)
|
|
||||||
}
|
|
||||||
exception?.addSuppressed(e)
|
|
||||||
exception = e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Result.failure(exception!!)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "RESULT_CLASS_IN_RETURN_TYPE")
|
|
||||||
@kotlin.internal.InlineOnly
|
|
||||||
@kotlin.internal.LowPriorityInOverloadResolution
|
|
||||||
public inline fun <R> retryCatchingExceptions(
|
|
||||||
n: Int,
|
|
||||||
except: KClass<out Exception>? = null,
|
|
||||||
block: (count: Int, lastException: Throwable?) -> R
|
|
||||||
): Result<R> {
|
|
||||||
require(n >= 0) {
|
|
||||||
"param n for retryCatching must not be negative"
|
|
||||||
}
|
|
||||||
var exception: Throwable? = null
|
|
||||||
repeat(n) {
|
|
||||||
try {
|
|
||||||
return Result.success(block(it, exception))
|
|
||||||
} catch (e: Exception) {
|
|
||||||
if (except?.isInstance(e) == true) {
|
|
||||||
return Result.failure(e)
|
|
||||||
}
|
|
||||||
exception?.addSuppressed(e)
|
|
||||||
exception = e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Result.failure(exception!!)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "RESULT_CLASS_IN_RETURN_TYPE")
|
|
||||||
@kotlin.internal.InlineOnly
|
|
||||||
public inline fun <R> retryCatching(
|
|
||||||
n: Int,
|
|
||||||
except: KClass<out Throwable>? = null,
|
|
||||||
block: () -> R
|
|
||||||
): Result<R> {
|
|
||||||
require(n >= 0) {
|
|
||||||
"param n for retryCatching must not be negative"
|
|
||||||
}
|
|
||||||
var exception: Throwable? = null
|
|
||||||
repeat(n) {
|
|
||||||
try {
|
|
||||||
return Result.success(block())
|
|
||||||
} catch (e: Throwable) {
|
|
||||||
if (except?.isInstance(e) == true) {
|
|
||||||
return Result.failure(e)
|
|
||||||
}
|
|
||||||
exception?.addSuppressed(e)
|
|
||||||
exception = e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Result.failure(exception!!)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "RESULT_CLASS_IN_RETURN_TYPE")
|
|
||||||
@kotlin.internal.InlineOnly
|
|
||||||
public inline fun <R> retryCatchingExceptions(
|
|
||||||
n: Int,
|
|
||||||
except: KClass<out Exception>? = null,
|
|
||||||
block: () -> R
|
|
||||||
): Result<R> {
|
|
||||||
require(n >= 0) {
|
|
||||||
"param n for retryCatching must not be negative"
|
|
||||||
}
|
|
||||||
var exception: Throwable? = null
|
|
||||||
repeat(n) {
|
|
||||||
try {
|
|
||||||
return Result.success(block())
|
|
||||||
} catch (e: Exception) {
|
|
||||||
if (except?.isInstance(e) == true) {
|
|
||||||
return Result.failure(e)
|
|
||||||
}
|
|
||||||
exception?.addSuppressed(e)
|
|
||||||
exception = e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Result.failure(exception!!)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "RESULT_CLASS_IN_RETURN_TYPE")
|
|
||||||
@kotlin.internal.InlineOnly
|
|
||||||
public inline fun <R> runCatchingExceptions(block: () -> R): Result<R> {
|
|
||||||
return try {
|
|
||||||
Result.success(block())
|
|
||||||
} catch (e: Exception) {
|
|
||||||
Result.failure(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public inline fun <E> MutableList<E>.replaceAllKotlin(operator: (E) -> E) {
|
public inline fun <E> MutableList<E>.replaceAllKotlin(operator: (E) -> E) {
|
||||||
val li: MutableListIterator<E> = this.listIterator()
|
val li: MutableListIterator<E> = this.listIterator()
|
||||||
while (li.hasNext()) {
|
while (li.hasNext()) {
|
||||||
@ -181,16 +50,6 @@ public inline fun <E> MutableList<E>.replaceAllKotlin(operator: (E) -> E) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun systemProp(name: String, default: String): String =
|
|
||||||
System.getProperty(name, default) ?: default
|
|
||||||
|
|
||||||
public fun systemProp(name: String, default: Boolean): Boolean =
|
|
||||||
System.getProperty(name, default.toString())?.toBoolean() ?: default
|
|
||||||
|
|
||||||
|
|
||||||
public fun systemProp(name: String, default: Long): Long =
|
|
||||||
System.getProperty(name, default.toString())?.toLongOrNull() ?: default
|
|
||||||
|
|
||||||
|
|
||||||
public fun Throwable.getRootCause(maxDepth: Int = 20): Throwable {
|
public fun Throwable.getRootCause(maxDepth: Int = 20): Throwable {
|
||||||
var depth = 0
|
var depth = 0
|
||||||
|
39
mirai-core-utils/src/commonMain/kotlin/systemProp.kt
Normal file
39
mirai-core-utils/src/commonMain/kotlin/systemProp.kt
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2021 Mamoe Technologies and contributors.
|
||||||
|
*
|
||||||
|
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
|
||||||
|
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
|
||||||
|
*
|
||||||
|
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@file:JvmMultifileClass
|
||||||
|
@file:JvmName("MiraiUtils")
|
||||||
|
|
||||||
|
package net.mamoe.mirai.utils
|
||||||
|
|
||||||
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
|
|
||||||
|
public fun systemProp(name: String, default: String): String =
|
||||||
|
System.getProperty(name, default) ?: default
|
||||||
|
|
||||||
|
public fun systemProp(name: String, default: Boolean): Boolean =
|
||||||
|
System.getProperty(name, default.toString())?.toBoolean() ?: default
|
||||||
|
|
||||||
|
|
||||||
|
public fun systemProp(name: String, default: Long): Long =
|
||||||
|
System.getProperty(name, default.toString())?.toLongOrNull() ?: default
|
||||||
|
|
||||||
|
|
||||||
|
private val debugProps = ConcurrentHashMap<String, Boolean>()
|
||||||
|
public fun Any?.toDebugString(prop: String, default: Boolean = false): String {
|
||||||
|
if (this == null) return "null"
|
||||||
|
val debug = debugProps.getOrPut(prop) { systemProp(prop, default) }
|
||||||
|
return if (debug) {
|
||||||
|
"${this::class.simpleName}($this)"
|
||||||
|
} else {
|
||||||
|
"${this::class.simpleName}"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user