package jp.juggler.util import kotlin.reflect.KProperty import kotlin.reflect.full.findAnnotation annotation class JsonPropInt(val key: String, val defVal: Int) annotation class JsonPropString(val key: String, val defVal: String) annotation class JsonPropBoolean(val key: String, val defVal: Boolean) class JsonDelegate(val parent: JsonDelegates) class JsonDelegates(val src: JsonObject) { val int = JsonDelegate(this) val string = JsonDelegate(this) val boolean = JsonDelegate(this) } private fun getMetaString(property: KProperty<*>) = property.findAnnotation() ?: error("${property.name}, required=String, defined=(missing)") operator fun JsonDelegate.getValue(thisRef: Any?, property: KProperty<*>): String = getMetaString(property).let { parent.src.string(it.key) ?: it.defVal } operator fun JsonDelegate.setValue(thisRef: Any?, property: KProperty<*>, value: String) { getMetaString(property).let { parent.src[it.key] = value } } private fun getMetaInt(property: KProperty<*>) = property.findAnnotation() ?: error("${property.name}, required=Int, defined=(missing)") operator fun JsonDelegate.getValue(thisRef: Any?, property: KProperty<*>): Int = getMetaInt(property).let { parent.src.int(it.key) ?: it.defVal } operator fun JsonDelegate.setValue(thisRef: Any?, property: KProperty<*>, value: Int) { getMetaInt(property).let { parent.src[it.key] = value } } private fun getMetaBoolean(property: KProperty<*>) = property.findAnnotation() ?: error("${property.name}, required=Boolean, defined=(missing)") operator fun JsonDelegate.getValue(thisRef: Any?, property: KProperty<*>): Boolean = getMetaBoolean(property).let { parent.src.boolean(it.key) ?: it.defVal } operator fun JsonDelegate.setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) { getMetaBoolean(property).let { parent.src[it.key] = value } }