Added common ancestor to descriptors
This commit is contained in:
parent
4e6cf3e785
commit
07ff982d08
@ -0,0 +1,9 @@
|
|||||||
|
package hep.dataforge.descriptors
|
||||||
|
|
||||||
|
interface ItemDescriptor {
|
||||||
|
val name: String
|
||||||
|
val multiple: Boolean
|
||||||
|
val required: Boolean
|
||||||
|
val info: String?
|
||||||
|
val tags: List<String>
|
||||||
|
}
|
@ -31,14 +31,14 @@ import hep.dataforge.names.toName
|
|||||||
*
|
*
|
||||||
* @author Alexander Nozik
|
* @author Alexander Nozik
|
||||||
*/
|
*/
|
||||||
class NodeDescriptor(override val config: Config) : Specific {
|
class NodeDescriptor(override val config: Config) : ItemDescriptor, Specific {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The name of this node
|
* The name of this node
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
var name: String by string { error("Anonymous descriptors are not allowed") }
|
override var name: String by string { error("Anonymous descriptors are not allowed") }
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,28 +54,28 @@ class NodeDescriptor(override val config: Config) : Specific {
|
|||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
var multiple: Boolean by boolean(false)
|
override var multiple: Boolean by boolean(false)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* True if the node is required
|
* True if the node is required
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
var required: Boolean by boolean { default == null }
|
override var required: Boolean by boolean { default == null }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The node description
|
* The node description
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
var info: String? by string()
|
override var info: String? by string()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A list of tags for this node. Tags used to customize node usage
|
* A list of tags for this node. Tags used to customize node usage
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
var tags: List<String> by value{ value ->
|
override var tags: List<String> by value { value ->
|
||||||
value?.list?.map { it.string } ?: emptyList()
|
value?.list?.map { it.string } ?: emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,6 +117,8 @@ class NodeDescriptor(override val config: Config) : Specific {
|
|||||||
node(name, build { this.name = name }.apply(block))
|
node(name, build { this.name = name }.apply(block))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val items: Map<String, ItemDescriptor> get() = nodes + values
|
||||||
|
|
||||||
|
|
||||||
//override val descriptor: NodeDescriptor = empty("descriptor")
|
//override val descriptor: NodeDescriptor = empty("descriptor")
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ import hep.dataforge.values.ValueType
|
|||||||
*
|
*
|
||||||
* @author Alexander Nozik
|
* @author Alexander Nozik
|
||||||
*/
|
*/
|
||||||
class ValueDescriptor(override val config: Config) : Specific {
|
class ValueDescriptor(override val config: Config) : ItemDescriptor, Specific {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The default for this value. Null if there is no default.
|
* The default for this value. Null if there is no default.
|
||||||
@ -47,28 +47,28 @@ class ValueDescriptor(override val config: Config) : Specific {
|
|||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
var multiple: Boolean by boolean(false)
|
override var multiple: Boolean by boolean(false)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* True if the value is required
|
* True if the value is required
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
var required: Boolean by boolean { default == null }
|
override var required: Boolean by boolean { default == null }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Value name
|
* Value name
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
var name: String by string { error("Anonymous descriptors are not allowed") }
|
override var name: String by string { error("Anonymous descriptors are not allowed") }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The value info
|
* The value info
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
var info: String? by string()
|
override var info: String? by string()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A list of allowed ValueTypes. Empty if any value type allowed
|
* A list of allowed ValueTypes. Empty if any value type allowed
|
||||||
@ -83,7 +83,7 @@ class ValueDescriptor(override val config: Config) : Specific {
|
|||||||
this.type = listOf(*t)
|
this.type = listOf(*t)
|
||||||
}
|
}
|
||||||
|
|
||||||
var tags: List<String> by value { value ->
|
override var tags: List<String> by value { value ->
|
||||||
value?.list?.map { it.string } ?: emptyList()
|
value?.list?.map { it.string } ?: emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ class Laminate(layers: List<Meta>) : Meta {
|
|||||||
|
|
||||||
constructor(vararg layers: Meta) : this(layers.asList())
|
constructor(vararg layers: Meta) : this(layers.asList())
|
||||||
|
|
||||||
override val items: Map<NameToken, MetaItem<out Meta>>
|
override val items: Map<NameToken, MetaItem<Meta>>
|
||||||
get() = layers.map { it.items.keys }.flatten().associateWith { key ->
|
get() = layers.map { it.items.keys }.flatten().associateWith { key ->
|
||||||
layers.asSequence().map { it.items[key] }.filterNotNull().let(replaceRule)
|
layers.asSequence().map { it.items[key] }.filterNotNull().let(replaceRule)
|
||||||
}
|
}
|
||||||
|
@ -143,7 +143,8 @@ fun <M : MetaNode<M>> M.getAll(name: Name): Map<String, MetaItem<M>> {
|
|||||||
|
|
||||||
fun <M : MetaNode<M>> M.getAll(name: String): Map<String, MetaItem<M>> = getAll(name.toName())
|
fun <M : MetaNode<M>> M.getAll(name: String): Map<String, MetaItem<M>> = getAll(name.toName())
|
||||||
|
|
||||||
operator fun <M : MetaNode<M>> MetaNode<M>.get(name: Name): MetaItem<M>? {
|
operator fun <M : MetaNode<M>> MetaNode<M>?.get(name: Name): MetaItem<M>? {
|
||||||
|
if (this == null) return null
|
||||||
return name.first()?.let { token ->
|
return name.first()?.let { token ->
|
||||||
val tail = name.cutFirst()
|
val tail = name.cutFirst()
|
||||||
when (tail.length) {
|
when (tail.length) {
|
||||||
@ -159,6 +160,12 @@ operator fun <M : MetaNode<M>> MetaNode<M>?.get(key: String): MetaItem<M>? = if
|
|||||||
this[key.toName()]
|
this[key.toName()]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
operator fun <M : MetaNode<M>> MetaNode<M>?.get(key: NameToken): MetaItem<M>? = if (this == null) {
|
||||||
|
null
|
||||||
|
} else {
|
||||||
|
this[key.asName()]
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Equals and hash code implementation for meta node
|
* Equals and hash code implementation for meta node
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user