aboutsummaryrefslogtreecommitdiff
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
parent0ccd5a4d92043b31af952d8bfd920696fda68a48 (diff)
Add CLI
-rw-r--r--pom.xml45
-rw-r--r--src/main/java/org/zwobble/couscous/cli/CouscousCli.java90
2 files changed, 135 insertions, 0 deletions
diff --git a/pom.xml b/pom.xml
index b7c9f4f..1e708cb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,6 +39,12 @@
<version>3.10.0</version>
<scope>compile</scope>
</dependency>
+ <dependency>
+ <groupId>commons-cli</groupId>
+ <artifactId>commons-cli</artifactId>
+ <version>1.3.1</version>
+ <scope>compile</scope>
+ </dependency>
</dependencies>
<build>
<plugins>
@@ -51,6 +57,45 @@
<target>1.8</target>
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.6</version>
+ <configuration>
+ <archive>
+ <manifest>
+ <addClasspath>true</addClasspath>
+ <mainClass>org.zwobble.couscous.cli.CouscousCli</mainClass>
+ </manifest>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-shade-plugin</artifactId>
+ <version>2.4.2</version>
+ <configuration>
+ <createDependencyReducedPom>false</createDependencyReducedPom>
+ <filters>
+ <filter>
+ <artifact>*:*</artifact>
+ <excludes>
+ <exclude>META-INF/*.SF</exclude>
+ <exclude>META-INF/*.DSA</exclude>
+ <exclude>META-INF/*.RSA</exclude>
+ </excludes>
+ </filter>
+ </filters>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>shade</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
</project>
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();
+ }
+}