aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-10 15:10:05 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-10 15:10:05 +0000
commit14c546d1d7067294d5a0e1aced7b21ee61430a7d (patch)
tree12b352483578f428085b02ec4a04be15ca1152d5 /src/main/java/org
parent0ccd5a4d92043b31af952d8bfd920696fda68a48 (diff)
Add CLI
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/couscous/cli/CouscousCli.java90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/couscous/cli/CouscousCli.java b/src/main/java/org/zwobble/couscous/cli/CouscousCli.java
new file mode 100644
index 0000000..561b3f5
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/cli/CouscousCli.java
@@ -0,0 +1,90 @@
+package org.zwobble.couscous.cli;
+
+import org.apache.commons.cli.*;
+import org.zwobble.couscous.Backend;
+import org.zwobble.couscous.ast.ClassNode;
+import org.zwobble.couscous.backends.python.PythonBackend;
+import org.zwobble.couscous.frontends.java.JavaFrontend;
+
+import java.io.IOException;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.util.List;
+
+import static java.util.Arrays.asList;
+import static org.zwobble.couscous.util.ExtraLists.eagerFlatMap;
+import static org.zwobble.couscous.util.ExtraLists.eagerMap;
+import static org.zwobble.couscous.util.ExtraLists.list;
+
+public class CouscousCli {
+ public static final String SOURCEPATH = "sourcepath";
+ public static final String BACKEND = "backend";
+ public static final String OUTPUT = "output";
+
+ public static void main(String[] rawArguments) throws Exception {
+ CommandLine arguments = parseArguments(rawArguments);
+
+ JavaFrontend frontend = new JavaFrontend();
+ List<ClassNode> classNodes = eagerFlatMap(
+ arguments.getArgList(),
+ path -> {
+ try {
+ return frontend.readSourceDirectory(
+ eagerMap(sourcePath(arguments), sourcePath -> path(sourcePath)),
+ path(path));
+ } catch (IOException exception) {
+ throw new RuntimeException(exception);
+ }
+ });
+
+ Backend backend = backend(
+ arguments.getOptionValue(BACKEND),
+ arguments.getOptionValue(OUTPUT));
+ backend.compile(classNodes);
+ }
+
+ private static List<String> sourcePath(CommandLine arguments) {
+ if (arguments.hasOption(SOURCEPATH)) {
+ return asList(arguments.getOptionValues(SOURCEPATH));
+ } else {
+ return list();
+ }
+ }
+
+ private static Backend backend(String backend, String output) {
+ switch (backend) {
+ case "python":
+ return new PythonBackend(path(output), "_couscous");
+ default:
+ throw new RuntimeException("Unrecognised backend: " + backend);
+ }
+ }
+
+ private static Path path(String output) {
+ return FileSystems.getDefault().getPath(output);
+ }
+
+ private static CommandLine parseArguments(String[] rawArguments) throws ParseException {
+ Options options = new Options();
+ options.addOption(requiredOption(BACKEND));
+ options.addOption(requiredOption(OUTPUT));
+ options.addOption(multipleOption(SOURCEPATH));
+
+ return new DefaultParser().parse(options, rawArguments);
+ }
+
+ private static Option requiredOption(String name) {
+ return Option.builder()
+ .longOpt(name)
+ .required()
+ .hasArg()
+ .build();
+ }
+
+ private static Option multipleOption(String name) {
+ return Option.builder()
+ .longOpt(name)
+ .hasArgs()
+ .build();
+ }
+}