blob: e646b7660cd0a88e5d68709b2832d6d0dce6b72f [file]
package com.intellij.configurationScript
import org.snakeyaml.engine.v2.nodes.*
internal fun findValueNodeByPath(namePath: String, rootNodes: List<NodeTuple>): List<NodeTuple>? {
return findNodeByPath(namePath, rootNodes, MappingNodeTypeFilter)
}
internal fun findListNodeByPath(namePath: String, rootNodes: List<NodeTuple>): List<Node>? {
return findNodeByPath(namePath, rootNodes, ListNodeTypeFilter)
}
private interface NodeTypeFilter<T : Any> {
fun convertToResult(node: Node): List<T>?
}
private object MappingNodeTypeFilter : NodeTypeFilter<NodeTuple> {
override fun convertToResult(node: Node): List<NodeTuple>? {
return (node as? MappingNode)?.value
}
}
private object ListNodeTypeFilter : NodeTypeFilter<Node> {
override fun convertToResult(node: Node): List<Node>? {
return (node as? SequenceNode)?.value
}
}
private fun <T : Any> findNodeByPath(namePath: String, rootNodes: List<NodeTuple>, filter: NodeTypeFilter<T>): List<T>? {
var nodes = rootNodes
val iterator = namePath.splitToSequence('.').iterator()
loop@
do {
val name = iterator.next()
for (tuple in nodes) {
val keyNode = tuple.keyNode
if (keyNode is ScalarNode && keyNode.value == name) {
if (iterator.hasNext()) {
nodes = (tuple.valueNode as? MappingNode)?.value ?: continue
}
else {
return filter.convertToResult(tuple.valueNode)
}
continue@loop
}
}
return null
} while (iterator.hasNext())
return null
}
inline fun List<NodeTuple>.processStringKeys(processor: (String, Node) -> Unit) {
for (tuple in this) {
val keyNode = tuple.keyNode
if (keyNode is ScalarNode) {
processor(keyNode.value, tuple.valueNode)
}
}
}