All Downloads are FREE. Search and download functionalities are using the official Maven repository.

iosX64Main.maryk.wrapWithErrorThrower.kt Maven / Gradle / Ivy

package maryk

import kotlinx.cinterop.CPointer
import kotlinx.cinterop.ObjCObjectVar
import kotlinx.cinterop.alloc
import kotlinx.cinterop.nativeHeap
import kotlinx.cinterop.ptr
import kotlinx.cinterop.value
import maryk.rocksdb.RocksDBException
import maryk.rocksdb.Status
import maryk.rocksdb.StatusCode.NotFound
import maryk.rocksdb.getStatusCode
import maryk.rocksdb.getStatusSubCode
import platform.Foundation.NSError

fun  T.wrapWithErrorThrower(runnable: T.(CPointer>) -> R): R {
    val errorRef = nativeHeap.alloc>()
    val result = runnable(errorRef.ptr)
    val error = errorRef.value

    if (error != null) {
        if (error.domain == "co.braincookie.objectiverocks.error") {
            val status = convertStatus(error)
            throw RocksDBException(error.localizedDescription +": "+error.localizedFailureReason, status)
        } else {
            throw RocksDBException(error.localizedDescription)
        }
    }

    return result
}

fun  T.wrapWithNullErrorThrower(runnable: T.(CPointer>) -> R?): R? {
    val errorRef = nativeHeap.alloc>()
    val result = runnable(errorRef.ptr)
    val error = errorRef.value

    if (error != null) {
        if (error.domain == "co.braincookie.objectiverocks.error") {
            val status = convertStatus(error)
            if (status.getCode() == NotFound) {
                return null
            }

            throw RocksDBException(error.localizedDescription +": "+error.localizedFailureReason, status)
        } else {
            throw RocksDBException(error.localizedDescription)
        }
    }

    return result
}

private fun convertStatus(error: NSError) = Status(
    getStatusCode(error.code.toByte()),
    error.userInfo["rocksdb.subcode"]?.let { getStatusSubCode((it as Short).toByte()) },
    error.localizedFailureReason
)




© 2015 - 2025 Weber Informatics LLC | Privacy Policy