diff --git a/.gitignore b/.gitignore index 81335df..6efeca9 100644 --- a/.gitignore +++ b/.gitignore @@ -36,11 +36,8 @@ replay_pid* # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf +.idea/** +*.iml # AWS User-specific .idea/**/aws.xml diff --git a/parser/src/main/java/nu/zoom/state/EndpointNode.java b/parser/src/main/java/nu/zoom/tapir/EndpointNode.java similarity index 75% rename from parser/src/main/java/nu/zoom/state/EndpointNode.java rename to parser/src/main/java/nu/zoom/tapir/EndpointNode.java index 1ca4a1c..aaa8f6f 100644 --- a/parser/src/main/java/nu/zoom/state/EndpointNode.java +++ b/parser/src/main/java/nu/zoom/tapir/EndpointNode.java @@ -1,4 +1,4 @@ -package nu.zoom.state; +package nu.zoom.tapir; public record EndpointNode(PathsNode paths, HandlerNode handler) { } diff --git a/parser/src/main/java/nu/zoom/state/FieldNode.java b/parser/src/main/java/nu/zoom/tapir/FieldNode.java similarity index 70% rename from parser/src/main/java/nu/zoom/state/FieldNode.java rename to parser/src/main/java/nu/zoom/tapir/FieldNode.java index 0cd12f1..d9a0814 100644 --- a/parser/src/main/java/nu/zoom/state/FieldNode.java +++ b/parser/src/main/java/nu/zoom/tapir/FieldNode.java @@ -1,4 +1,4 @@ -package nu.zoom.state; +package nu.zoom.tapir; public record FieldNode(String name, String type) { } diff --git a/parser/src/main/java/nu/zoom/tapir/Generator.java b/parser/src/main/java/nu/zoom/tapir/Generator.java new file mode 100755 index 0000000..2282e1d --- /dev/null +++ b/parser/src/main/java/nu/zoom/tapir/Generator.java @@ -0,0 +1,70 @@ +package nu.zoom.tapir; + +import nu.zoom.tapir.parser.*; + +import java.io.IOException; +import java.io.StringReader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.concurrent.Callable; + +import picocli.CommandLine; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import picocli.CommandLine.Parameters; + +@Command(name = "tapirgen", mixinStandardHelpOptions = true, description = "Generate source code from a tapir endpoint specification file.") +public class Generator implements Callable { + @Parameters(index = "0", description = "The source tapir file.") + private Path file; + + @Option(names = {"-t", "--template"}, description = "The template directory. Default is ~/tapir-templates") + private Path templateDir = Paths.get(System.getProperty("user.dir"), "tapir-templates"); + + @Option(names = {"-o", "--output"}, description = "The directory to write the gerenated code to. Default is ~/tapir-output") + private Path outputDir = Paths.get(System.getProperty("user.dir"), "tapir-output"); + + public static void main(String[] args) throws ParseException { + int exitCode = new CommandLine(new Generator()).execute(args); + System.exit(exitCode); + } + + @Override + public Integer call() { + try { + validateTemplateDirectory(); + validateInputFile(); + StringReader reader = new StringReader("foo/bar/baz/ -> fooHandler(id:String, name:NonEmptyString)foo/baz/->bazHandler(nothing:Any)"); + var rootNode = new TapirParser(reader).endpoints(); + var endpoints = NodeTransformer.transform(rootNode); + rootNode.dump(""); + endpoints.forEach(endpoint -> { + System.out.println(endpoint); + }); + return 0; + } catch (Exception e) { + System.err.println(e.getMessage()); + return 1; + } + } + + private void validateTemplateDirectory() throws IOException { + if (!Files.isDirectory(this.templateDir)) { + throw new IllegalArgumentException("Template directory '" + this.templateDir + "' does not exist."); + } + Path endpointTemplate = this.templateDir.resolve("endpoints.ftl") ; + if (Files.notExists(endpointTemplate)) { + throw new IllegalArgumentException("Can not find: '" + endpointTemplate + "'."); + } + } + + private void validateInputFile() throws IOException { + if (Files.notExists(this.file)) { + throw new IllegalArgumentException("Input file '" + this.file + "' does not exist."); + } + if (!Files.isReadable(this.file) || !Files.isRegularFile(this.file)) { + throw new IllegalArgumentException("Input file '" + this.file + "' is not a readable file."); + } + } +} diff --git a/parser/src/main/java/nu/zoom/state/HandlerNode.java b/parser/src/main/java/nu/zoom/tapir/HandlerNode.java similarity index 80% rename from parser/src/main/java/nu/zoom/state/HandlerNode.java rename to parser/src/main/java/nu/zoom/tapir/HandlerNode.java index fe221ce..71f4c8b 100644 --- a/parser/src/main/java/nu/zoom/state/HandlerNode.java +++ b/parser/src/main/java/nu/zoom/tapir/HandlerNode.java @@ -1,4 +1,4 @@ -package nu.zoom.state; +package nu.zoom.tapir; import java.util.List; diff --git a/parser/src/main/java/nu/zoom/state/NodeTransformer.java b/parser/src/main/java/nu/zoom/tapir/NodeTransformer.java similarity index 99% rename from parser/src/main/java/nu/zoom/state/NodeTransformer.java rename to parser/src/main/java/nu/zoom/tapir/NodeTransformer.java index 1704a2f..c4ed179 100644 --- a/parser/src/main/java/nu/zoom/state/NodeTransformer.java +++ b/parser/src/main/java/nu/zoom/tapir/NodeTransformer.java @@ -1,4 +1,4 @@ -package nu.zoom.state; +package nu.zoom.tapir; import nu.zoom.tapir.parser.Node; import nu.zoom.tapir.parser.ParseException; diff --git a/parser/src/main/java/nu/zoom/state/PathsNode.java b/parser/src/main/java/nu/zoom/tapir/PathsNode.java similarity index 76% rename from parser/src/main/java/nu/zoom/state/PathsNode.java rename to parser/src/main/java/nu/zoom/tapir/PathsNode.java index d29e048..a766b53 100644 --- a/parser/src/main/java/nu/zoom/state/PathsNode.java +++ b/parser/src/main/java/nu/zoom/tapir/PathsNode.java @@ -1,4 +1,4 @@ -package nu.zoom.state; +package nu.zoom.tapir; import java.util.List; diff --git a/parser/src/main/java/nu/zoom/state/TargetGenerator.java b/parser/src/main/java/nu/zoom/tapir/TargetGenerator.java similarity index 97% rename from parser/src/main/java/nu/zoom/state/TargetGenerator.java rename to parser/src/main/java/nu/zoom/tapir/TargetGenerator.java index 05adbc1..f4bcfa8 100644 --- a/parser/src/main/java/nu/zoom/state/TargetGenerator.java +++ b/parser/src/main/java/nu/zoom/tapir/TargetGenerator.java @@ -1,4 +1,4 @@ -package nu.zoom.state; +package nu.zoom.tapir; import java.nio.file.Path; import java.util.List;