kotlin multiplatform and proto kind of working?

This commit is contained in:
Adam 2021-10-31 11:32:27 +01:00
parent 5bb5f42af0
commit 6dce641d6b
9 changed files with 207 additions and 22 deletions

View file

@ -0,0 +1,63 @@
package dev.adamko.factorioevents.model
import kotlin.js.JsExport
import kotlin.jvm.JvmInline
//expect sealed interface JsonPrimitive {
// value class JsonString(val string: String) : JsonPrimitive
// value class JsonNumber(val number: Number) : JsonPrimitive
// value class JsonBoolean(val boolean: Boolean) : JsonPrimitive
//}
sealed interface JsonPrimitive {
@JvmInline
value class JsonString(val string: String) : JsonPrimitive
@JvmInline
value class JsonNumber(val number: Number) : JsonPrimitive
@JvmInline
value class JsonBoolean(val boolean: Boolean) : JsonPrimitive
}
class JsonArray<T : JsonPrimitive?>(
private val list: MutableList<T> = mutableListOf()
) : MutableList<T> by list
sealed interface JsonTableValue {
@JvmInline
value class JsonPrimitiveTV(val primitive: JsonPrimitive) : JsonTableValue
@JvmInline
value class JsonArrayTV<T : JsonPrimitive?>(val array: JsonArray<T>) : JsonTableValue
@JvmInline
value class JsonTableTV<T : JsonTable?>(val array: JsonTable) : JsonTableValue
}
//expect class JsonNumber() : JsonPrimitiveType
//expect class JsonArray<T : JsonPrimitive?>
//expect open class JsonTable<K : JsonPrimitive.JsonString, V : JsonTableValue?>
open class JsonTable(
protected val map: MutableMap<JsonPrimitive.JsonString, JsonTableValue?> = mutableMapOf()
) : MutableMap<JsonPrimitive.JsonString, JsonTableValue?> by map {
inline fun <reified T> get2(key: String): T? {
val jKey = JsonPrimitive.JsonString(key)
return when {
T::class is Number -> ((get(jKey) as? JsonTableValue.JsonPrimitiveTV)?.primitive as? JsonPrimitive.JsonNumber)?.number as? T
else -> return get(jKey) as? T
}
}
}
//@JsExport
class FactorioEvent : JsonTable() {
val tick: UInt?
get() = get2("tick")
// set(value) = map.put("tick", value)
}

View file

@ -0,0 +1,31 @@
package dev.adamko.factorioevents.model
//actual sealed interface JsonPrimitive {
// actual value class JsonString(val string: String) : JsonPrimitive
// actual value class JsonNumber(val number: Number) : JsonPrimitive
// actual value class JsonBoolean(val boolean: Boolean) : JsonPrimitive
//}
//actual class JsonArray<T : JsonPrimitive?>(
// private val list: MutableList<T> = mutableListOf()
//) : MutableList<T> by list
//actual sealed interface JsonTableValue {
// actual value class JsonPrimitiveTV(val primitive: JsonPrimitive) : JsonTableValue
// actual value class JsonArrayTV<T : JsonPrimitive?>(val array: JsonArray<T>) : JsonTableValue
//}
//actual open class JsonTable<K : JsonPrimitive.JsonString, V: JsonTableValue?>(
// private val map: MutableMap<K, V> = mutableMapOf()
//) : MutableMap<K, V> by map
fun printMap() {
val f = JsonPrimitive.JsonString("test")
println(f.string)
println(f)
}

View file

@ -0,0 +1,55 @@
interface Identifiable<T> {
val id: T
}
interface IndexedModel {
val index: UInt
}
interface NamedModel {
val name: String
}
data class SurfaceModel(
override val name: String,
override val index: UInt,
val daytime: Float,
val darkness: Float,
val wind_speed: Double,
) : IndexedModel, NamedModel
/** Player/Entity shared props */
interface ControlModel {
val driving: Boolean
val forces: List<ForceModel>
}
//data class PlayerModel(
// val index: UInt,
// val characters: List<EntityModel>
//) : Identifiable<UInt> {
// override val id: UInt = index
//}
//data class EntityModel(
// val unit_number: Int,
// override val name: String,
// val type: String,
// val active: Boolean,
// val minable: Boolean,
// val health: Boolean,
// val speed: Float, override val driving: Boolean,
//) : ControlModel, NamedModel
data class ForceModel(
val index: UInt,
override val name: String,
val research_progress: Double,
) : Identifiable<UInt>, NamedModel {
override val id: UInt = index
}