You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.2 KiB
Kotlin
43 lines
1.2 KiB
Kotlin
package me.eater.hefbrug.selector
|
|
|
|
import me.eater.hefbrug.node.Node
|
|
|
|
class NodeSelector(private val selector: NameSelector) : SelectorInterface {
|
|
override fun matches(node: Node): Boolean {
|
|
return selector.match(node.hostname)
|
|
}
|
|
|
|
constructor(selector: String) : this(
|
|
if ("*" in selector) {
|
|
NameSelector.RegexMatch(globToRegex(selector))
|
|
} else {
|
|
NameSelector.ExactMatch(selector)
|
|
}
|
|
)
|
|
|
|
constructor(selector: Regex) : this(NameSelector.RegexMatch(selector))
|
|
|
|
sealed class NameSelector {
|
|
data class ExactMatch(val name: String) : NameSelector() {
|
|
override fun match(name: String) = name == this.name
|
|
}
|
|
|
|
data class RegexMatch(val regex: Regex) : NameSelector() {
|
|
override fun match(name: String) = regex.matches(name)
|
|
}
|
|
|
|
abstract fun match(name: String): Boolean
|
|
}
|
|
|
|
companion object {
|
|
fun globToRegex(glob: String): Regex {
|
|
val regexStr = glob
|
|
.replace(Regex("""\*+""")) { """\E.+\Q""" }
|
|
.replace(Regex("""\?+""")) { """\E[^\.]+\Q""" }
|
|
.replace("""\Q\E""", "")
|
|
|
|
return Regex("""^\Q$regexStr\E$""", RegexOption.IGNORE_CASE)
|
|
}
|
|
}
|
|
}
|