diff --git a/build.gradle.kts b/build.gradle.kts index 0dbaef48..cfa22253 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { 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 githubProject by extra("dataforge-core") diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/descriptors/Described.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/descriptors/Described.kt index f355c828..f2ab0c00 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/descriptors/Described.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/descriptors/Described.kt @@ -1,7 +1,7 @@ package hep.dataforge.descriptors 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.node @@ -19,11 +19,11 @@ interface Described { /** * 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() { return if (this is Described) { descriptor } else { - get(DESCRIPTOR_NODE).node?.let { NodeDescriptor.wrap(it) } + toMeta()[DESCRIPTOR_NODE].node?.let { NodeDescriptor.wrap(it) } } } \ No newline at end of file diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Specific.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Specific.kt index a4ebffe6..850365a5 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Specific.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Specific.kt @@ -1,7 +1,10 @@ package hep.dataforge.meta import hep.dataforge.names.Name +import hep.dataforge.names.asName import kotlin.jvm.JvmName +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty /** * Marker interface for classes with specifications @@ -61,13 +64,27 @@ fun > Specific.update(spec: S, action: C.() - fun > S.createStyle(action: C.() -> Unit): Meta = Config().also { update(it, action) } +class SpecDelegate>( + val target: Specific, + val spec: S, + val key: Name? = null +) : ReadWriteProperty { + override fun getValue(thisRef: Any?, property: KProperty<*>): T { + return target.config[key ?: property.name.asName()]?.node?.let { spec.wrap(it) } ?: spec.empty() + } -fun Specific.spec( - spec: Specification, + override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { + target.config[key ?: property.name.asName()] = value.config + } +} + +fun > Specific.spec( + spec: S, key: Name? = null -): MutableMorphDelegate = MutableMorphDelegate(config, key) { spec.wrap(it) } +): SpecDelegate = SpecDelegate(this, spec, key) fun MetaItem<*>.spec(spec: Specification): T? = node?.let { spec.wrap(it) } @JvmName("configSpec") -fun MetaItem.spec(spec: Specification): T? = node?.let { spec.wrap(it) } \ No newline at end of file +fun MetaItem.spec(spec: Specification): T? = node?.let { spec.wrap(it) } + diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/metaDelegates.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/metaDelegates.kt index 0921eae8..02caa9fa 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/metaDelegates.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/metaDelegates.kt @@ -350,8 +350,8 @@ class MutableNodeDelegate>( } } -class MutableMorphDelegate, T : Configurable>( - val meta: M, +class MutableMorphDelegate( + val meta: MutableMeta<*>, private val key: Name? = null, private val converter: (Meta) -> T ) : ReadWriteProperty {