From 24187722e4e78935724cd8e410082491ddca9cbc Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 7 Aug 2021 12:02:34 +0300 Subject: [PATCH] Move scheme descriptors to core --- .../meta/descriptors/MetaDescriptorBuilder.kt | 48 +++++++++++-------- .../meta/descriptors/schemeDescriptor.kt | 48 +++++++++++++++++++ 2 files changed, 77 insertions(+), 19 deletions(-) create mode 100644 dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/descriptors/schemeDescriptor.kt diff --git a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder.kt b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder.kt index 8f1882c4..7688f3cc 100644 --- a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder.kt +++ b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder.kt @@ -12,7 +12,7 @@ import kotlin.collections.set public class MetaDescriptorBuilder internal constructor() { public var info: String? = null - public var children: MutableMap = hashMapOf() + public var children: MutableMap = linkedMapOf() public var multiple: Boolean = false public var valueRequirement: ValueRequirement = ValueRequirement.NONE @@ -35,24 +35,6 @@ public class MetaDescriptorBuilder internal constructor() { attributes.apply(block) } - public fun item( - name: Name, - descriptor: MetaDescriptor, - block: MetaDescriptorBuilder.() -> Unit = {} - ): MetaDescriptorBuilder { - return when (name.length) { - 0 -> error("Can't set descriptor to root") - 1 -> { - val item = descriptor.toBuilder().apply(block) - children[name.first().body] = item - item - } - else -> children.getOrPut(name.first().body) { - MetaDescriptorBuilder() - }.item(name.cutFirst(), descriptor, block) - } - } - public fun item(name: Name, block: MetaDescriptorBuilder.() -> Unit = {}): MetaDescriptorBuilder { return when (name.length) { 0 -> apply(block) @@ -67,6 +49,24 @@ public class MetaDescriptorBuilder internal constructor() { } } + public fun node( + name: Name, + descriptor: MetaDescriptor, + block: MetaDescriptorBuilder.() -> Unit = {} + ): MetaDescriptorBuilder = when (name.length) { + 0 -> error("Can't set descriptor to root") + 1 -> { + val item = descriptor.toBuilder().apply { + valueRequirement = ValueRequirement.ABSENT + }.apply(block) + children[name.first().body] = item + item + } + else -> children.getOrPut(name.first().body) { + MetaDescriptorBuilder() + }.node(name.cutFirst(), descriptor, block) + } + public var allowedValues: List get() = attributes[MetaDescriptor.ALLOWED_VALUES_KEY]?.value?.list ?: emptyList() set(value) { @@ -131,6 +131,16 @@ public fun MetaDescriptorBuilder.node(name: String, block: MetaDescriptorBuilder node(Name.parse(name), block) } +public fun MetaDescriptorBuilder.node( + key: String, + described: Described, + block: MetaDescriptorBuilder.() -> Unit = {}, +) { + described.descriptor?.let { + node(Name.parse(key), it, block) + } +} + public fun MetaDescriptorBuilder.required() { valueRequirement = ValueRequirement.REQUIRED } diff --git a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/descriptors/schemeDescriptor.kt b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/descriptors/schemeDescriptor.kt new file mode 100644 index 00000000..060d3a80 --- /dev/null +++ b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/descriptors/schemeDescriptor.kt @@ -0,0 +1,48 @@ +package space.kscience.dataforge.meta.descriptors + +import space.kscience.dataforge.meta.Scheme +import space.kscience.dataforge.meta.SchemeSpec +import space.kscience.dataforge.values.ValueType +import kotlin.reflect.KProperty1 +import kotlin.reflect.typeOf + +public inline fun MetaDescriptorBuilder.value( + property: KProperty1, + noinline block: MetaDescriptorBuilder.() -> Unit = {}, +) { + when (typeOf()) { + typeOf(), typeOf(), typeOf(), typeOf(), typeOf(), typeOf() -> + value(property.name, ValueType.NUMBER) { + block() + } + typeOf(), typeOf(), typeOf(), typeOf(), typeOf(), typeOf() -> + value(property.name, ValueType.NUMBER) { + block() + } + typeOf() -> value(property.name, ValueType.BOOLEAN) { + block() + } + typeOf>(), typeOf>(), typeOf>(), typeOf>(), typeOf>(), typeOf>(), + typeOf(), typeOf(), typeOf(), typeOf(), typeOf(), + -> value(property.name, ValueType.NUMBER) { + multiple = true + block() + } + typeOf() -> value(property.name, ValueType.STRING) { + block() + } + typeOf>(), typeOf>() -> value(property.name, ValueType.STRING) { + multiple = true + block() + } + else -> item(property.name, block) + } +} + +public inline fun MetaDescriptorBuilder.scheme( + property: KProperty1, + spec: SchemeSpec, + noinline block: MetaDescriptorBuilder.() -> Unit = {}, +) { + node(property.name, spec, block) +} \ No newline at end of file