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

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)
}
}
}