kweb.html.StorageReceiver.kt Maven / Gradle / Ivy
package kweb.html
import kotlinx.serialization.json.*
import kotlinx.serialization.serializer
import kweb.WebBrowser
import kweb.util.KWebDSL
/**
* Created by ian on 1/14/17.
*/
@KWebDSL
class StorageReceiver(val receiver: WebBrowser, val type: StorageType) {
private val obj = "${type.name}Storage"
operator fun set(key: String, value: String) {
set(key, JsonPrimitive(value))
}
operator fun set(key: String, value: Int) {
set(key, JsonPrimitive(value))
}
operator fun set(key: String, value: Float) {
set(key, JsonPrimitive(value))
}
operator fun set(key: String, value: Double) {
set(key, JsonPrimitive(value))
}
operator fun set(key: String, value: Short) {
set(key, JsonPrimitive(value))
}
operator fun set(key: String, value: Long) {
set(key, JsonPrimitive(value))
}
operator fun set(key: String, value: Boolean) {
set(key, JsonPrimitive(value))
}
operator fun set(key: String, value: Char) {
set(key, JsonPrimitive(value.toString()))
}
operator fun set(key: String, value: Byte) {
set(key, JsonPrimitive(value))
}
operator fun set(key: String, value: JsonElement) {
if (value == JsonNull || value.toString() == "") {
throw IllegalArgumentException("$obj cannot store the value \"\"")
}
//language=JavaScript
receiver.callJsFunction("$obj.setItem({}, {});", JsonPrimitive(key), value)
}
suspend inline fun get(name: String): V? {
val result = getString(name)
val serializer = serializer()
return when(result) {
null -> null
else -> Json.decodeFromString(serializer, result)
}
}
suspend fun getString(key: String): String? {
return when (val result = Json
.decodeFromJsonElement(
receiver.callJsFunctionWithResult("return $obj.getItem({});", JsonPrimitive(key)))) {
"" -> null
else -> result
}
}
fun remove(key: String) {
//language=JavaScript
receiver.callJsFunction("$obj.removeItem({});", JsonPrimitive(key))
}
}
enum class StorageType {
local, session
}