Fix #12
This commit is contained in:
parent
264ed14cf4
commit
10de05240c
@ -2,13 +2,11 @@ package hep.dataforge.io.yaml
|
||||
|
||||
import hep.dataforge.context.Context
|
||||
import hep.dataforge.io.*
|
||||
import hep.dataforge.meta.EmptyMeta
|
||||
import hep.dataforge.meta.Meta
|
||||
import hep.dataforge.meta.get
|
||||
import hep.dataforge.meta.string
|
||||
import hep.dataforge.meta.*
|
||||
import kotlinx.io.core.*
|
||||
import kotlinx.serialization.toUtf8Bytes
|
||||
|
||||
@DFExperimental
|
||||
class FrontMatterEnvelopeFormat(
|
||||
val io: IOPlugin,
|
||||
val metaType: String = YamlMetaFormat.name.toString(),
|
||||
|
@ -4,6 +4,7 @@ import hep.dataforge.context.Context
|
||||
import hep.dataforge.descriptors.NodeDescriptor
|
||||
import hep.dataforge.io.MetaFormat
|
||||
import hep.dataforge.io.MetaFormatFactory
|
||||
import hep.dataforge.meta.DFExperimental
|
||||
import hep.dataforge.meta.Meta
|
||||
import hep.dataforge.meta.toMap
|
||||
import hep.dataforge.meta.toMeta
|
||||
@ -29,6 +30,7 @@ private class InputAsStream(val input: Input) : InputStream() {
|
||||
|
||||
private fun Input.asStream() = InputAsStream(this)
|
||||
|
||||
@DFExperimental
|
||||
class YamlMetaFormat(val meta: Meta) : MetaFormat {
|
||||
private val yaml = Yaml()
|
||||
|
||||
|
@ -117,11 +117,11 @@ fun <T : Specific> Configurable.spec(builder: (Config) -> T, key: Name? = null)
|
||||
* Extra delegates for special cases
|
||||
*/
|
||||
|
||||
fun Configurable.stringList(key: Name? = null): ReadWriteDelegateWrapper<Value?, List<String>> =
|
||||
value(emptyList(), key) { it?.list?.map { value -> value.string } ?: emptyList() }
|
||||
fun Configurable.stringList(vararg strings: String, key: Name? = null): ReadWriteDelegateWrapper<Value?, List<String>> =
|
||||
value(strings.asList(), key) { it?.list?.map { value -> value.string } ?: emptyList() }
|
||||
|
||||
fun Configurable.numberList(key: Name? = null): ReadWriteDelegateWrapper<Value?, List<Number>> =
|
||||
value(emptyList(), key) { it?.list?.map { value -> value.number } ?: emptyList() }
|
||||
fun Configurable.numberList(vararg numbers: Number, key: Name? = null): ReadWriteDelegateWrapper<Value?, List<Number>> =
|
||||
value(numbers.asList(), key) { it?.list?.map { value -> value.number } ?: emptyList() }
|
||||
|
||||
/**
|
||||
* A special delegate for double arrays
|
||||
|
@ -14,6 +14,7 @@ import hep.dataforge.values.Value
|
||||
/**
|
||||
* Convert meta to map of maps
|
||||
*/
|
||||
@DFExperimental
|
||||
fun Meta.toMap(descriptor: NodeDescriptor? = null): Map<String, Any?> {
|
||||
return items.entries.associate { (token, item) ->
|
||||
token.toString() to when (item) {
|
||||
@ -26,6 +27,7 @@ fun Meta.toMap(descriptor: NodeDescriptor? = null): Map<String, Any?> {
|
||||
/**
|
||||
* Convert map of maps to meta
|
||||
*/
|
||||
@DFExperimental
|
||||
fun Map<String, Any?>.toMeta(descriptor: NodeDescriptor? = null): Meta = buildMeta {
|
||||
entries.forEach { (key, value) ->
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
|
@ -41,7 +41,7 @@ interface Value {
|
||||
* get this value represented as List
|
||||
*/
|
||||
val list: List<Value>
|
||||
get() = listOf(this)
|
||||
get() = if(this == Null) emptyList() else listOf(this)
|
||||
|
||||
override fun equals(other: Any?): Boolean
|
||||
|
||||
@ -60,7 +60,14 @@ interface Value {
|
||||
true -> True
|
||||
false -> False
|
||||
is Number -> value.asValue()
|
||||
is Iterable<*> -> ListValue(value.map { of(it) })
|
||||
is Iterable<*> -> {
|
||||
val list = value.map { of(it) }
|
||||
if (list.isEmpty()) {
|
||||
Null
|
||||
} else {
|
||||
ListValue(list)
|
||||
}
|
||||
}
|
||||
is DoubleArray -> value.asValue()
|
||||
is IntArray -> value.asValue()
|
||||
is FloatArray -> value.asValue()
|
||||
@ -174,9 +181,7 @@ class EnumValue<E : Enum<*>>(override val value: E) : Value {
|
||||
|
||||
class ListValue(override val list: List<Value>) : Value {
|
||||
init {
|
||||
if (list.isEmpty()) {
|
||||
throw IllegalArgumentException("Can't create list value from empty list")
|
||||
}
|
||||
require(list.isNotEmpty()) { "Can't create list value from empty list" }
|
||||
}
|
||||
|
||||
override val value: List<Value> get() = list
|
||||
@ -208,17 +213,20 @@ fun Boolean.asValue(): Value = if (this) True else False
|
||||
|
||||
fun String.asValue(): Value = StringValue(this)
|
||||
|
||||
fun Iterable<Value>.asValue(): Value = ListValue(this.toList())
|
||||
fun Iterable<Value>.asValue(): Value {
|
||||
val list = toList()
|
||||
return if (list.isEmpty()) Null else ListValue(this.toList())
|
||||
}
|
||||
|
||||
fun IntArray.asValue(): Value = ListValue(map { NumberValue(it) })
|
||||
fun IntArray.asValue(): Value = if (isEmpty()) Null else ListValue(map { NumberValue(it) })
|
||||
|
||||
fun LongArray.asValue(): Value = ListValue(map { NumberValue(it) })
|
||||
fun LongArray.asValue(): Value = if (isEmpty()) Null else ListValue(map { NumberValue(it) })
|
||||
|
||||
fun ShortArray.asValue(): Value = ListValue(map { NumberValue(it) })
|
||||
fun ShortArray.asValue(): Value = if (isEmpty()) Null else ListValue(map { NumberValue(it) })
|
||||
|
||||
fun FloatArray.asValue(): Value = ListValue(map { NumberValue(it) })
|
||||
fun FloatArray.asValue(): Value = if (isEmpty()) Null else ListValue(map { NumberValue(it) })
|
||||
|
||||
fun ByteArray.asValue(): Value = ListValue(map { NumberValue(it) })
|
||||
fun ByteArray.asValue(): Value = if (isEmpty()) Null else ListValue(map { NumberValue(it) })
|
||||
|
||||
|
||||
/**
|
||||
|
@ -46,4 +46,4 @@ class DoubleArrayValue(override val value: DoubleArray) : Value {
|
||||
override fun toString(): String = list.joinToString (prefix = "[", postfix = "]")
|
||||
}
|
||||
|
||||
fun DoubleArray.asValue(): DoubleArrayValue = DoubleArrayValue(this)
|
||||
fun DoubleArray.asValue(): Value = if(isEmpty()) Null else DoubleArrayValue(this)
|
||||
|
@ -0,0 +1,23 @@
|
||||
package hep.dataforge.meta
|
||||
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class SpecificationTest {
|
||||
class TestSpecific(override val config: Config) : Specific {
|
||||
var list by numberList(1, 2, 3)
|
||||
|
||||
companion object : Specification<TestSpecific> {
|
||||
override fun wrap(config: Config): TestSpecific = TestSpecific(config)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
fun testSpecific(){
|
||||
val testObject = TestSpecific.build {
|
||||
list = emptyList()
|
||||
}
|
||||
assertEquals(emptyList(), testObject.list)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user