IO Operators
This commit is contained in:
parent
b9f419a59d
commit
82a8fccf87
22 changed files with 450 additions and 199 deletions
63
src/io/Terminal.kt
Normal file
63
src/io/Terminal.kt
Normal file
|
@ -0,0 +1,63 @@
|
|||
package io
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
Reference in a new issue