package org.rascalmpl.shell;
import java.io.IOException;
import java.io.PrintWriter;
import org.rascalmpl.value.IInteger;
import org.rascalmpl.value.IValue;
import org.rascalmpl.value.io.StandardTextWriter;
import org.rascalmpl.debug.IRascalMonitor;
import org.rascalmpl.interpreter.Evaluator;
import org.rascalmpl.interpreter.NullRascalMonitor;
import org.rascalmpl.interpreter.staticErrors.CommandlineError;
import org.rascalmpl.interpreter.utils.RascalManifest;
import org.rascalmpl.uri.URIUtil;
public class ManifestRunner implements ShellRunner {
private final RascalManifest mf;
private final Evaluator eval;
public ManifestRunner(RascalManifest mf, PrintWriter stdout, PrintWriter stderr) {
assert mf.hasManifest(ManifestRunner.class);
this.mf = mf;
this.eval = ShellEvaluatorFactory.getDefaultEvaluator(stdout, stderr);
addExtraSourceFolders();
}
void addExtraSourceFolders() {
for (String root : mf.getSourceRoots(ManifestRunner.class)) {
eval.addRascalSearchPath(URIUtil.getChildLocation(URIUtil.rootLocation("manifest"), root));
}
}
@Override
public void run(String[] args) throws IOException {
IRascalMonitor monitor = new NullRascalMonitor();
String module = mf.getMainModule(ManifestRunner.class);
assert module != null;
eval.doImport(monitor, module);
String main = mf.getMainFunction(ManifestRunner.class);
main = main != null ? main : RascalManifest.DEFAULT_MAIN_FUNCTION;
try {
IValue v = eval.main(monitor, module, main, args);
if (v.getType().isInteger()) {
System.exit(((IInteger) v).intValue());
} else {
new StandardTextWriter(true).write(v, eval.getStdOut());
eval.getStdOut().flush();
System.exit(0);
}
} catch (CommandlineError e) {
System.err.println(e.getMessage());
System.err.println(e.help("java -jar ..."));
}
}
}