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

commonMain.io.github.jan.supabase.Utils.kt Maven / Gradle / Ivy

There is a newer version: 3.0.2
Show newest version
package io.github.jan.supabase

import io.github.jan.supabase.annotations.SupabaseInternal
import io.github.jan.supabase.exceptions.SupabaseEncodingException
import io.ktor.client.statement.HttpResponse
import io.ktor.client.statement.bodyAsText
import io.ktor.http.URLBuilder
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.MissingFieldException
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonObjectBuilder
import kotlinx.serialization.json.decodeFromJsonElement

@SupabaseInternal
val supabaseJson = Json {
    ignoreUnknownKeys = true
    encodeDefaults = false
}

@OptIn(ExperimentalSerializationApi::class)
@SupabaseInternal
suspend inline fun  HttpResponse.safeBody(context: String? = null): T {
    val text = bodyAsText()
    val contextMessage = if(context != null) " in $context" else ""
    return try {
        supabaseJson.decodeFromString(text)
    } catch(e: MissingFieldException) {
        throw SupabaseEncodingException("Couldn't decode payload$contextMessage as ${T::class.simpleName}. Input: ${text.replace("\n", "")}")
    }
}

@SupabaseInternal
inline fun buildUrl(baseUrl: String, init: URLBuilder.() -> Unit): String {
    val builder = URLBuilder(baseUrl)
    builder.init()
    return builder.buildString()
}

@SupabaseInternal
fun String.toJsonObject(): JsonObject = supabaseJson.decodeFromString(this)

@SupabaseInternal
fun JsonObjectBuilder.putJsonObject(jsonObject: JsonObject) {
    for (key in jsonObject.keys) {
        put(key, jsonObject[key]!!)
    }
}

@SupabaseInternal
inline fun  JsonObject.decodeIfNotEmptyOrDefault(default: T): T {
    return if(isEmpty()) {
        default
    } else {
        supabaseJson.decodeFromJsonElement(this)
    }
}

@SupabaseInternal
suspend inline fun  HttpResponse.bodyOrNull(): T? {
    return try {
        val text = bodyAsText()
        supabaseJson.decodeFromString(text)
    } catch(e: Exception) {
        null
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy