Specialized non-null delegates for spec
This commit is contained in:
parent
e532e8358e
commit
1b879eccc7
@ -6,7 +6,7 @@ plugins {
|
|||||||
id("scientifik.publish") version toolsVersion apply false
|
id("scientifik.publish") version toolsVersion apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
val dataforgeVersion by extra("0.1.5-dev-5")
|
val dataforgeVersion by extra("0.1.5-dev-6")
|
||||||
|
|
||||||
val bintrayRepo by extra("dataforge")
|
val bintrayRepo by extra("dataforge")
|
||||||
val githubProject by extra("dataforge-core")
|
val githubProject by extra("dataforge-core")
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package hep.dataforge.descriptors
|
package hep.dataforge.descriptors
|
||||||
|
|
||||||
import hep.dataforge.descriptors.Described.Companion.DESCRIPTOR_NODE
|
import hep.dataforge.descriptors.Described.Companion.DESCRIPTOR_NODE
|
||||||
import hep.dataforge.meta.Meta
|
import hep.dataforge.meta.MetaRepr
|
||||||
import hep.dataforge.meta.get
|
import hep.dataforge.meta.get
|
||||||
import hep.dataforge.meta.node
|
import hep.dataforge.meta.node
|
||||||
|
|
||||||
@ -19,11 +19,11 @@ interface Described {
|
|||||||
/**
|
/**
|
||||||
* If meta node supplies explicit descriptor, return it, otherwise try to use descriptor node from meta itself
|
* If meta node supplies explicit descriptor, return it, otherwise try to use descriptor node from meta itself
|
||||||
*/
|
*/
|
||||||
val Meta.descriptor: NodeDescriptor?
|
val MetaRepr.descriptor: NodeDescriptor?
|
||||||
get() {
|
get() {
|
||||||
return if (this is Described) {
|
return if (this is Described) {
|
||||||
descriptor
|
descriptor
|
||||||
} else {
|
} else {
|
||||||
get(DESCRIPTOR_NODE).node?.let { NodeDescriptor.wrap(it) }
|
toMeta()[DESCRIPTOR_NODE].node?.let { NodeDescriptor.wrap(it) }
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,7 +1,10 @@
|
|||||||
package hep.dataforge.meta
|
package hep.dataforge.meta
|
||||||
|
|
||||||
import hep.dataforge.names.Name
|
import hep.dataforge.names.Name
|
||||||
|
import hep.dataforge.names.asName
|
||||||
import kotlin.jvm.JvmName
|
import kotlin.jvm.JvmName
|
||||||
|
import kotlin.properties.ReadWriteProperty
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Marker interface for classes with specifications
|
* Marker interface for classes with specifications
|
||||||
@ -61,13 +64,27 @@ fun <C : Specific, S : Specification<C>> Specific.update(spec: S, action: C.() -
|
|||||||
fun <C : Specific, S : Specification<C>> S.createStyle(action: C.() -> Unit): Meta =
|
fun <C : Specific, S : Specification<C>> S.createStyle(action: C.() -> Unit): Meta =
|
||||||
Config().also { update(it, action) }
|
Config().also { update(it, action) }
|
||||||
|
|
||||||
|
class SpecDelegate<T : Specific, S : Specification<T>>(
|
||||||
|
val target: Specific,
|
||||||
|
val spec: S,
|
||||||
|
val key: Name? = null
|
||||||
|
) : ReadWriteProperty<Any?, T> {
|
||||||
|
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
|
||||||
|
return target.config[key ?: property.name.asName()]?.node?.let { spec.wrap(it) } ?: spec.empty()
|
||||||
|
}
|
||||||
|
|
||||||
fun <C : Specific> Specific.spec(
|
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
|
||||||
spec: Specification<C>,
|
target.config[key ?: property.name.asName()] = value.config
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T : Specific, S : Specification<T>> Specific.spec(
|
||||||
|
spec: S,
|
||||||
key: Name? = null
|
key: Name? = null
|
||||||
): MutableMorphDelegate<Config, C> = MutableMorphDelegate(config, key) { spec.wrap(it) }
|
): SpecDelegate<T, S> = SpecDelegate(this, spec, key)
|
||||||
|
|
||||||
fun <T : Specific> MetaItem<*>.spec(spec: Specification<T>): T? = node?.let { spec.wrap(it) }
|
fun <T : Specific> MetaItem<*>.spec(spec: Specification<T>): T? = node?.let { spec.wrap(it) }
|
||||||
|
|
||||||
@JvmName("configSpec")
|
@JvmName("configSpec")
|
||||||
fun <T : Specific> MetaItem<Config>.spec(spec: Specification<T>): T? = node?.let { spec.wrap(it) }
|
fun <T : Specific> MetaItem<Config>.spec(spec: Specification<T>): T? = node?.let { spec.wrap(it) }
|
||||||
|
|
||||||
|
@ -350,8 +350,8 @@ class MutableNodeDelegate<M : MutableMeta<M>>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class MutableMorphDelegate<M : MutableMeta<M>, T : Configurable>(
|
class MutableMorphDelegate<T : Configurable>(
|
||||||
val meta: M,
|
val meta: MutableMeta<*>,
|
||||||
private val key: Name? = null,
|
private val key: Name? = null,
|
||||||
private val converter: (Meta) -> T
|
private val converter: (Meta) -> T
|
||||||
) : ReadWriteProperty<Any?, T?> {
|
) : ReadWriteProperty<Any?, T?> {
|
||||||
|
Loading…
Reference in New Issue
Block a user