diff --git a/dataforge-meta/api/dataforge-meta.api b/dataforge-meta/api/dataforge-meta.api index a72681ba..13a1ee29 100644 --- a/dataforge-meta/api/dataforge-meta.api +++ b/dataforge-meta/api/dataforge-meta.api @@ -128,6 +128,7 @@ public final class hep/dataforge/meta/ItemProvider$Companion { public final class hep/dataforge/meta/ItemProviderKt { public static final fun get (Lhep/dataforge/meta/ItemProvider;Lhep/dataforge/names/Name;)Lhep/dataforge/meta/MetaItem; public static final fun get (Lhep/dataforge/meta/ItemProvider;Ljava/lang/String;)Lhep/dataforge/meta/MetaItem; + public static final fun getChild (Lhep/dataforge/meta/ItemProvider;Lhep/dataforge/names/Name;)Lhep/dataforge/meta/ItemProvider; public static final fun getIndexed (Lhep/dataforge/meta/ItemProvider;Lhep/dataforge/names/Name;)Ljava/util/Map; public static final fun getIndexed (Lhep/dataforge/meta/ItemProvider;Ljava/lang/String;)Ljava/util/Map; public static final fun getIndexed (Lhep/dataforge/meta/TypedMeta;Lhep/dataforge/names/Name;)Ljava/util/Map; @@ -251,7 +252,6 @@ public final class hep/dataforge/meta/MetaBuilder : hep/dataforge/meta/AbstractM public final class hep/dataforge/meta/MetaBuilderKt { public static final fun Meta (Lkotlin/jvm/functions/Function1;)Lhep/dataforge/meta/MetaBuilder; public static final fun builder (Lhep/dataforge/meta/Meta;)Lhep/dataforge/meta/MetaBuilder; - public static final fun edit (Lhep/dataforge/meta/Meta;Lkotlin/jvm/functions/Function1;)Lhep/dataforge/meta/MetaBuilder; } public abstract class hep/dataforge/meta/MetaItem { @@ -415,6 +415,8 @@ public abstract interface class hep/dataforge/meta/MutableItemProvider : hep/dat } public final class hep/dataforge/meta/MutableItemProviderKt { + public static final fun editChild (Lhep/dataforge/meta/MutableItemProvider;Lhep/dataforge/names/Name;Lkotlin/jvm/functions/Function1;)Lhep/dataforge/meta/MutableItemProvider; + public static final fun getChild (Lhep/dataforge/meta/MutableItemProvider;Lhep/dataforge/names/Name;)Lhep/dataforge/meta/MutableItemProvider; public static final fun remove (Lhep/dataforge/meta/MutableItemProvider;Lhep/dataforge/names/Name;)V public static final fun remove (Lhep/dataforge/meta/MutableItemProvider;Ljava/lang/String;)V public static final fun set (Lhep/dataforge/meta/MutableItemProvider;Lhep/dataforge/names/Name;Lhep/dataforge/meta/Meta;)V diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ItemProvider.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ItemProvider.kt index 736753c2..dcb369a0 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ItemProvider.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/ItemProvider.kt @@ -62,6 +62,13 @@ public fun ItemProvider.getIndexed(name: Name): Map> { public fun ItemProvider.getIndexed(name: String): Map> = this@getIndexed.getIndexed(name.toName()) +/** + * Return a provider referencing a child node + */ +public fun ItemProvider.getChild(childName: Name): ItemProvider = get(childName).node ?: ItemProvider.EMPTY + +public fun ItemProvider.getChild(childName: String): ItemProvider = getChild(childName.toName()) + /** * Get all items matching given name. */ diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/JsonMeta.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/JsonMeta.kt index 1b028477..f41da67e 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/JsonMeta.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/JsonMeta.kt @@ -2,6 +2,7 @@ package hep.dataforge.meta +import hep.dataforge.meta.JsonMeta.Companion.JSON_ARRAY_KEY import hep.dataforge.meta.descriptors.ItemDescriptor import hep.dataforge.meta.descriptors.ItemDescriptor.Companion.DEFAULT_INDEX_KEY import hep.dataforge.meta.descriptors.NodeDescriptor diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Meta.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Meta.kt index cad22948..719fc744 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Meta.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Meta.kt @@ -4,6 +4,7 @@ import hep.dataforge.meta.MetaItem.NodeItem import hep.dataforge.meta.MetaItem.ValueItem import hep.dataforge.names.* import hep.dataforge.values.Value +import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MetaBuilder.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MetaBuilder.kt index 12730d46..8ebceaa3 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MetaBuilder.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MetaBuilder.kt @@ -133,11 +133,6 @@ public fun Meta.builder(): MetaBuilder { } } -/** - * Create a deep copy of this meta and apply builder to it - */ -public inline fun Meta.edit(builder: MetaBuilder.() -> Unit): MetaBuilder = builder().apply(builder) - /** * Build a [MetaBuilder] using given transformation */ diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MetaItem.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MetaItem.kt index c85d8ba2..fd1de97a 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MetaItem.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MetaItem.kt @@ -3,6 +3,7 @@ package hep.dataforge.meta import hep.dataforge.meta.MetaItem.NodeItem import hep.dataforge.meta.MetaItem.ValueItem import hep.dataforge.values.* +import kotlinx.serialization.Serializable /** * A member of the meta tree. Could be represented as one of following: diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MutableItemProvider.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MutableItemProvider.kt index 854bba62..d2a1de38 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MutableItemProvider.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MutableItemProvider.kt @@ -74,6 +74,31 @@ public operator fun MutableItemProvider.set(name: Name, metas: Iterable): public operator fun MutableItemProvider.set(name: String, metas: Iterable): Unit = setIndexed(name.toName(), metas) +/** + * Get a [MutableItemProvider] referencing a child node + */ +public fun MutableItemProvider.getChild(childName: Name): MutableItemProvider { + fun createProvider() = object : MutableItemProvider { + override fun setItem(name: Name, item: MetaItem<*>?) { + this@getChild.setItem(childName + name, item) + } + + override fun getItem(name: Name): MetaItem<*>? = this@getChild.getItem(childName + name) + } + + return when { + childName.isEmpty() -> this + this is MutableMeta<*> -> { + get(childName).node ?: createProvider() + } + else -> { + createProvider() + } + } +} + +public fun MutableItemProvider.getChild(childName: String): MutableItemProvider = getChild(childName.toName()) + /** * Update existing mutable node with another node. The rules are following: * * value replaces anything @@ -84,6 +109,12 @@ public fun MutableItemProvider.update(meta: Meta) { meta.valueSequence().forEach { (name, value) -> set(name, value) } } +/** + * Edit a provider child at given name location + */ +public fun MutableItemProvider.editChild(name: Name, builder: MutableItemProvider.() -> Unit): MutableItemProvider = + getChild(name).apply(builder) + /** * Create a mutable item provider that uses given provider for default values if those are not found in this provider. * Changes are propagated only to this provider. diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MutableMeta.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MutableMeta.kt index e4ec6c4b..aaa44998 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MutableMeta.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/MutableMeta.kt @@ -46,7 +46,7 @@ public abstract class AbstractMutableMeta> : AbstractTypedMet override fun setItem(name: Name, item: MetaItem<*>?) { when (name.length) { - 0 -> error("Can't setValue meta item for empty name") + 0 -> error("Can't set a meta item for empty name") 1 -> { val token = name.firstOrNull()!! val oldItem: MetaItem? = getItem(name) diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Scheme.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Scheme.kt index e307010d..222c439a 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Scheme.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/Scheme.kt @@ -110,17 +110,6 @@ public open class SchemeSpec( final override inline operator fun invoke(action: T.() -> Unit): T = empty().apply(action) } -///** -// * A scheme that uses [Meta] as a default layer -// */ -//public open class MetaScheme( -// private val meta: Meta, -// override val descriptor: NodeDescriptor? = null, -// config: Config = Config(), -//) : Scheme(config, meta) { -// override val defaultLayer: Meta get() = Laminate(meta, descriptor?.defaultItem().node) -//} - public fun Meta.asScheme(): Scheme = Scheme().apply { items = this@asScheme.asConfig() } diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/transformations/MetaTransformation.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/transformations/MetaTransformation.kt index 7048fe64..7f8e8097 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/transformations/MetaTransformation.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/meta/transformations/MetaTransformation.kt @@ -49,7 +49,7 @@ public data class KeepTransformationRule(val selector: (Name) -> Boolean) : */ public data class SingleItemTransformationRule( val from: Name, - val transform: MutableMeta<*>.(Name, MetaItem<*>?) -> Unit + val transform: MutableMeta<*>.(Name, MetaItem<*>?) -> Unit, ) : TransformationRule { override fun matches(name: Name, item: MetaItem<*>?): Boolean { return name == from @@ -66,7 +66,7 @@ public data class SingleItemTransformationRule( public data class RegexItemTransformationRule( val from: Regex, - val transform: MutableMeta<*>.(name: Name, MatchResult, MetaItem<*>?) -> Unit + val transform: MutableMeta<*>.(name: Name, MatchResult, MetaItem<*>?) -> Unit, ) : TransformationRule { override fun matches(name: Name, item: MetaItem<*>?): Boolean { return from.matches(name.toString()) @@ -116,7 +116,7 @@ public inline class MetaTransformation(public val transformations: Collection rule.selectItems(source).forEach { name -> remove(name)