Utility methods to access Configurable properties

This commit is contained in:
Alexander Nozik 2020-03-16 22:52:54 +03:00
parent bc8878da48
commit e835d81183
5 changed files with 55 additions and 37 deletions

View File

@ -1,12 +1,12 @@
plugins { plugins {
val toolsVersion = "0.4.0-dev" val toolsVersion = "0.4.0"
id("scientifik.mpp") version toolsVersion apply false id("scientifik.mpp") version toolsVersion apply false
id("scientifik.jvm") version toolsVersion apply false id("scientifik.jvm") version toolsVersion apply false
id("scientifik.publish") version toolsVersion apply false id("scientifik.publish") version toolsVersion apply false
} }
val dataforgeVersion by extra("0.1.5-dev-11") val dataforgeVersion by extra("0.1.5")
val bintrayRepo by extra("dataforge") val bintrayRepo by extra("dataforge")
val githubProject by extra("dataforge-core") val githubProject by extra("dataforge-core")

View File

@ -67,6 +67,7 @@ fun ItemDescriptor.validateItem(item: MetaItem<*>?): Boolean {
* *
* @author Alexander Nozik * @author Alexander Nozik
*/ */
@DFBuilder
class NodeDescriptor : ItemDescriptor() { class NodeDescriptor : ItemDescriptor() {
/** /**

View File

@ -32,34 +32,37 @@ interface Configurable : Described {
} }
override val descriptor: NodeDescriptor? get() = null override val descriptor: NodeDescriptor? get() = null
}
/** /**
* Get a property with default * Get a property with default
*/ */
fun Configurable.getProperty(name: Name): MetaItem<*>? = fun getProperty(name: Name): MetaItem<*>? =
config[name] ?: getDefaultItem(name) ?: descriptor?.get(name)?.defaultItem() config[name] ?: getDefaultItem(name) ?: descriptor?.get(name)?.defaultItem()
fun Configurable.getProperty(key: String) = getProperty(key.toName()) /**
* Set a configurable property
/** */
* Set a configurable property fun setProperty(name: Name, item: MetaItem<*>?) {
*/ if (validateItem(name, item)) {
fun Configurable.setProperty(name: Name, item: MetaItem<*>?) { config[name] = item
if (validateItem(name, item)) { } else {
config[name] = item error("Validation failed for property $name with value $item")
} else { }
error("Validation failed for property $name with value $item")
} }
} }
fun Configurable.setProperty(name: Name, value: Value) = setProperty(name, MetaItem.ValueItem(value)) fun Configurable.getProperty(key: String) = getProperty(key.toName())
fun Configurable.setProperty(name: Name, meta: Meta) = setProperty(name, MetaItem.NodeItem(meta))
fun Configurable.setProperty(name: Name, value: Value?) = setProperty(name, value?.let { MetaItem.ValueItem(value) })
fun Configurable.setProperty(name: Name, meta: Meta?) = setProperty(name, meta?.let { MetaItem.NodeItem(meta) })
fun Configurable.setProperty(key: String, item: MetaItem<*>?) { fun Configurable.setProperty(key: String, item: MetaItem<*>?) {
setProperty(key.toName(), item) setProperty(key.toName(), item)
} }
fun Configurable.setProperty(key: String, value: Value?) = setProperty(key, value?.let { MetaItem.ValueItem(value) })
fun Configurable.setProperty(key: String, meta: Meta?) = setProperty(key, meta?.let { MetaItem.NodeItem(meta) })
fun <T : Configurable> T.configure(meta: Meta): T = this.apply { config.update(meta) } fun <T : Configurable> T.configure(meta: Meta): T = this.apply { config.update(meta) }
inline fun <T : Configurable> T.configure(action: Config.() -> Unit): T = apply { config.apply(action) } inline fun <T : Configurable> T.configure(action: Config.() -> Unit): T = apply { config.apply(action) }

View File

@ -170,7 +170,7 @@ fun Configurable.float(default: Float, key: Name? = null): ReadWriteProperty<Any
*/ */
fun <E : Enum<E>> Configurable.enum( fun <E : Enum<E>> Configurable.enum(
default: E, key: Name? = null, resolve: MetaItem<*>.() -> E? default: E, key: Name? = null, resolve: MetaItem<*>.() -> E?
): ReadWriteProperty<Any?, E> = item(default, key).transform {it?.resolve() ?: default } ): ReadWriteProperty<Any?, E> = item(default, key).transform { it?.resolve() ?: default }
/* /*
* Extra delegates for special cases * Extra delegates for special cases
@ -206,17 +206,31 @@ fun Configurable.node(key: Name? = null): ReadWriteProperty<Any?, Meta?> = item(
writer = { it?.let { MetaItem.NodeItem(it) } } writer = { it?.let { MetaItem.NodeItem(it) } }
) )
fun <T : Configurable> Configurable.spec(spec: Specification<T>, key: Name? = null): ReadWriteProperty<Any?, T?> = fun <T : Configurable> Configurable.spec(
object : ReadWriteProperty<Any?, T?> { spec: Specification<T>, key: Name? = null
override fun getValue(thisRef: Any?, property: KProperty<*>): T? { ): ReadWriteProperty<Any?, T?> = object : ReadWriteProperty<Any?, T?> {
val name = key ?: property.name.asName() override fun getValue(thisRef: Any?, property: KProperty<*>): T? {
return config[name].node?.let { spec.wrap(it) } val name = key ?: property.name.asName()
} return config[name].node?.let { spec.wrap(it) }
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
val name = key ?: property.name.asName()
config[name] = value?.config
}
} }
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
val name = key ?: property.name.asName()
config[name] = value?.config
}
}
fun <T : Configurable> Configurable.spec(
spec: Specification<T>, default: T, key: Name? = null
): ReadWriteProperty<Any?, T> = object : ReadWriteProperty<Any?, T> {
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
val name = key ?: property.name.asName()
return config[name].node?.let { spec.wrap(it) }?:default
}
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
val name = key ?: property.name.asName()
config[name] = value.config
}
}

View File

@ -18,11 +18,10 @@ open class Scheme() : Configurable, Described, MetaRepr {
//constructor(config: Config, default: Meta) : this(config, { default[it] }) //constructor(config: Config, default: Meta) : this(config, { default[it] })
constructor(config: Config) : this(config, { null }) constructor(config: Config) : this(config, { null })
final override var config: Config = final override var config: Config = Config()
Config()
internal set internal set
lateinit var defaultProvider: (Name) -> MetaItem<*>? var defaultProvider: (Name) -> MetaItem<*>? = { null }
internal set internal set
final override var descriptor: NodeDescriptor? = null final override var descriptor: NodeDescriptor? = null
@ -53,9 +52,10 @@ open class Scheme() : Configurable, Described, MetaRepr {
token to item token to item
} ?: emptyMap() } ?: emptyMap()
} }
} }
inline operator fun <T : Scheme> T.invoke(block: T.() -> Unit) = apply(block)
/** /**
* A specification for simplified generation of wrappers * A specification for simplified generation of wrappers
*/ */