71 lines
1.6 KiB
Kotlin
71 lines
1.6 KiB
Kotlin
package io
|
|
|
|
import prolog.ast.Database.Program
|
|
import java.io.BufferedReader
|
|
import java.io.BufferedWriter
|
|
import java.io.InputStream
|
|
import java.io.OutputStream
|
|
|
|
/**
|
|
* Handles input and output from a terminal.
|
|
*/
|
|
class Terminal(
|
|
inputStream: InputStream = System.`in`,
|
|
outputStream: OutputStream = System.`out`,
|
|
errorStream: OutputStream = System.err
|
|
) : IoHandler {
|
|
val input: BufferedReader = inputStream.bufferedReader()
|
|
val output: BufferedWriter = outputStream.bufferedWriter()
|
|
val error: BufferedWriter = errorStream.bufferedWriter()
|
|
|
|
override fun prompt(
|
|
message: String,
|
|
hint: () -> String
|
|
): String {
|
|
say("$message ")
|
|
var input: String = readLine()
|
|
while (input.isBlank()) {
|
|
say(hint(), error)
|
|
input = readLine()
|
|
}
|
|
return input
|
|
}
|
|
|
|
override fun say(message: String) {
|
|
output.write(message)
|
|
output.flush()
|
|
}
|
|
|
|
fun say(message: String, writer: BufferedWriter = output) {
|
|
writer.write(message)
|
|
writer.flush()
|
|
}
|
|
|
|
/**
|
|
* Reads a line from the input stream.
|
|
*/
|
|
fun readLine(reader: BufferedReader = input): String {
|
|
val line = reader.readLine()
|
|
if (line == null) {
|
|
Logger.info("End of stream reached")
|
|
cleanup()
|
|
}
|
|
return line
|
|
|
|
}
|
|
|
|
fun cleanup() {
|
|
Logger.info("Closing terminal streams")
|
|
input.close()
|
|
output.close()
|
|
error.close()
|
|
System.exit(0)
|
|
}
|
|
|
|
fun checkNewLine() {
|
|
if (Program.storeNewLine) {
|
|
say("\n")
|
|
Program.storeNewLine = false
|
|
}
|
|
}
|
|
}
|