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