Readline.init(rl);
return rl;
}
public static void init(final IokeObject rl) throws ControlFlow {
Runtime runtime = rl.runtime;
rl.setKind("Readline");
rl.singleMimicsWithoutCheck(runtime.origin);
runtime.ground.setCell("Readline", rl);
rl.setCell("VERSION", runtime.newText("JLine wrapper"));
final ConsoleHolder holder = new ConsoleHolder();
holder.history = new History();
holder.currentCompletor = null;
IokeObject history = runtime.newFromOrigin();
rl.setCell("HISTORY", history);
rl.registerMethod(runtime.newNativeMethod("will print a prompt to standard out and then try to read a line with working readline functionality. takes two arguments, the first is the string to prompt, the second is a boolean that says whether we should add the read string to history or not", new NativeMethod("readline") {
private final DefaultArgumentsDefinition ARGUMENTS = DefaultArgumentsDefinition
.builder()
.withRequiredPositional("prompt")
.withRequiredPositional("addToHistory?")
.getArguments();
@Override
public DefaultArgumentsDefinition getArguments() {
return ARGUMENTS;
}
@Override
public Object activate(IokeObject method, IokeObject context, IokeObject message, Object on) throws ControlFlow {
List<Object> args = new ArrayList<Object>();
getArguments().getEvaluatedArguments(context, message, on, args, new HashMap<String, Object>());
Object line = method.runtime.nil;
try {
if(holder.readline == null) {
initReadline(method.runtime, holder);
}
holder.readline.getTerminal().disableEcho();
String v = holder.readline.readLine(Text.getText(args.get(0)));
holder.readline.getTerminal().enableEcho();
if(null != v) {
if(IokeObject.isTrue(args.get(1))) {
holder.readline.getHistory().addToHistory(v);
}
line = method.runtime.newText(v);
}
} catch(IOException e) {
final Runtime runtime = context.runtime;
final IokeObject condition = IokeObject.as(IokeObject.getCellChain(runtime.condition,
message,
context,
"Error",
"IO"), context).mimic(message, context);
condition.setCell("message", message);
condition.setCell("context", context);
condition.setCell("receiver", on);
condition.setCell("exceptionMessage", runtime.newText(e.getMessage()));
List<Object> ob = new ArrayList<Object>();
for(StackTraceElement ste : e.getStackTrace()) {
ob.add(runtime.newText(ste.toString()));
}
condition.setCell("exceptionStackTrace", runtime.newList(ob));
runtime.withReturningRestart("ignore", context, new RunnableWithControlFlow() {
public void run() throws ControlFlow {
runtime.errorCondition(condition);
}});
}
return line;
}
}));
history.registerMethod(runtime.newNativeMethod("will add a new line to the history", new NativeMethod("<<") {
private final DefaultArgumentsDefinition ARGUMENTS = DefaultArgumentsDefinition
.builder()
.withRequiredPositional("line")
.getArguments();