transcendental-lisp/src/main/LispMain.java

131 lines
4.4 KiB
Java
Raw Normal View History

package main;
import static terminal.LispTerminal.END_OF_SEGMENT;
import java.io.*;
2017-02-11 13:33:34 -05:00
import java.util.function.Function;
import com.googlecode.lanterna.terminal.*;
import interpreter.*;
2017-03-17 16:07:25 -04:00
import terminal.LispTerminal;
2017-03-21 12:07:22 -04:00
import terminal.SafeStream.SafePipedOutputStream;
import terminal.SafeStream.UncheckedIOException;
public class LispMain {
2017-02-11 13:33:34 -05:00
private static final String ANSI_RESET = "\u001B[0m";
private static final String ANSI_RED = "\u001B[31m";
private static final String ANSI_GREEN = "\u001B[32m";
private static final String ANSI_YELLOW = "\u001B[33m";
private static final String ANSI_PURPLE = "\u001B[35m";
2017-03-21 12:07:22 -04:00
public static void main(String[] args) throws IOException {
LispMain lispMain = new LispMain();
if (args.length == 0)
lispMain.runInteractive();
else
lispMain.runWithFile(args[0]);
}
private PipedInputStream inputReader;
private PipedOutputStream inputWriter;
private PipedInputStream outputReader;
private PipedOutputStream outputWriter;
2017-03-21 12:07:22 -04:00
private SafePipedOutputStream safeOutputWriter;
private LispTerminal lispTerminal;
2017-02-11 13:33:34 -05:00
private IOSafeTerminal createIOSafeTerminal() throws IOException {
2017-03-21 12:07:22 -04:00
Terminal defaultTerminal = new DefaultTerminalFactory().createTerminal();
2017-03-21 12:07:22 -04:00
return IOSafeTerminalAdapter.createRuntimeExceptionConvertingAdapter(defaultTerminal);
}
2017-03-17 16:07:25 -04:00
2017-03-21 12:07:22 -04:00
private void runInteractive() {
initializeTerminal();
lispTerminal.start();
buildInteractiveInterpreter().interpret();
}
2017-03-21 12:07:22 -04:00
private LispInterpreter buildInteractiveInterpreter() {
LispInterpreterBuilder builder = LispInterpreterBuilderImpl.getInstance();
2017-03-21 12:07:22 -04:00
PrintStream outputStream = new PrintStream(outputWriter);
builder.setInput(inputReader, "terminal");
builder.setOutput(outputStream);
builder.setErrorOutput(outputStream);
builder.setTerminationFunction(this::shutdown);
builder.setErrorTerminationFunction(this::shutdown);
builder.setOutputDecorator(makeInteractiveDecorator(ANSI_GREEN));
builder.setValueOutputDecorator(s -> s);
builder.setWarningOutputDecorator(s -> s);
builder.setErrorOutputDecorator(s -> s);
builder.setCriticalOutputDecorator(s -> s);
return builder.build();
}
2017-03-21 12:07:22 -04:00
private void shutdown() {
lispTerminal.stop();
safeOutputWriter.close();
}
2017-03-21 12:07:22 -04:00
private static Function<String, String> makeInteractiveDecorator(String color) {
return new Function<String, String>() {
@Override
public String apply(String s) {
return s + END_OF_SEGMENT;
}
};
}
2017-03-21 12:07:22 -04:00
private void initializeTerminal() {
try {
2017-03-21 12:07:22 -04:00
initalizeTerminalWithException();
} catch (IOException e) {
2017-03-21 12:07:22 -04:00
throw new UncheckedIOException(e);
}
}
2017-03-21 12:07:22 -04:00
private void initalizeTerminalWithException() throws IOException {
inputReader = new PipedInputStream();
inputWriter = new PipedOutputStream(inputReader);
outputReader = new PipedInputStream();
outputWriter = new PipedOutputStream(outputReader);
safeOutputWriter = new SafePipedOutputStream(outputWriter);
lispTerminal = new LispTerminal(createIOSafeTerminal(), inputWriter, outputReader);
}
2017-03-21 12:07:22 -04:00
private void runWithFile(String fileName) {
buildFileInterpreter(fileName).interpret();
}
2017-03-21 12:07:22 -04:00
private LispInterpreter buildFileInterpreter(String fileName) {
LispInterpreterBuilder builder = LispInterpreterBuilderImpl.getInstance();
builder.useFile(fileName);
builder.setOutput(System.out);
builder.setErrorOutput(System.err);
builder.setTerminationFunction(() -> System.exit(0));
builder.setErrorTerminationFunction(() -> System.exit(1));
builder.setOutputDecorator(makeColorDecorator(ANSI_GREEN));
builder.setValueOutputDecorator(makeColorDecorator(ANSI_GREEN));
builder.setWarningOutputDecorator(makeColorDecorator(ANSI_YELLOW));
builder.setErrorOutputDecorator(makeColorDecorator(ANSI_RED));
builder.setCriticalOutputDecorator(makeColorDecorator(ANSI_PURPLE));
2017-02-11 13:33:34 -05:00
2017-03-21 12:07:22 -04:00
return builder.build();
2017-02-11 13:33:34 -05:00
}
2017-03-21 12:07:22 -04:00
private static Function<String, String> makeColorDecorator(String color) {
return new Function<String, String>() {
@Override
public String apply(String s) {
2017-03-21 12:07:22 -04:00
return color + s + ANSI_RESET;
}
};
}
}