-
Notifications
You must be signed in to change notification settings - Fork 0
/
Console.kt
44 lines (36 loc) · 1.28 KB
/
Console.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package world.avionik.console.factory
import org.jline.reader.LineReader
import org.jline.reader.impl.completer.ArgumentCompleter
import org.jline.reader.impl.completer.StringsCompleter
import world.avionik.console.factory.input.ConsoleInput
import world.avionik.console.factory.terminal.TerminalFactory
import kotlin.system.exitProcess
/**
* @author Niklas Nieberler
*/
abstract class Console(
vararg consoleInput: ConsoleInput
) {
private val defaultConsoleInputs = arrayListOf(
*consoleInput,
ConsoleInput("shutdown", "stop") { exitProcess(0) },
)
init {
val lineReader = createConsoleReader()
Thread { executeConsole(lineReader) }.start()
}
private fun createConsoleReader(): LineReader {
val consoleInputNames = this.defaultConsoleInputs.map { it.name.toList() }
val argumentCompleter = ArgumentCompleter(
StringsCompleter(consoleInputNames.flatten())
)
return TerminalFactory.create(argumentCompleter)
}
private fun executeConsole(lineReader: LineReader) {
val readLine = lineReader.readLine()
this.defaultConsoleInputs
.filter { it.contains(readLine.replace(" ", "")) }
.forEach { it.executor.execute() }
executeConsole(lineReader)
}
}