Parser for tapir file and transformer. Started on generator.
This commit is contained in:
parent
d602a68d90
commit
e4b1daf0c2
8 changed files with 185 additions and 0 deletions
0
endpoints.tapir
Normal file
0
endpoints.tapir
Normal file
4
parser/src/main/java/nu/zoom/state/EndpointNode.java
Normal file
4
parser/src/main/java/nu/zoom/state/EndpointNode.java
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
package nu.zoom.state;
|
||||||
|
|
||||||
|
public record EndpointNode(PathsNode paths, HandlerNode handler) {
|
||||||
|
}
|
4
parser/src/main/java/nu/zoom/state/FieldNode.java
Normal file
4
parser/src/main/java/nu/zoom/state/FieldNode.java
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
package nu.zoom.state;
|
||||||
|
|
||||||
|
public record FieldNode(String name, String type) {
|
||||||
|
}
|
6
parser/src/main/java/nu/zoom/state/HandlerNode.java
Normal file
6
parser/src/main/java/nu/zoom/state/HandlerNode.java
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
package nu.zoom.state;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public record HandlerNode(String name, List<FieldNode> fields) {
|
||||||
|
}
|
127
parser/src/main/java/nu/zoom/state/NodeTransformer.java
Normal file
127
parser/src/main/java/nu/zoom/state/NodeTransformer.java
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
package nu.zoom.state;
|
||||||
|
|
||||||
|
import nu.zoom.tapir.parser.Node;
|
||||||
|
import nu.zoom.tapir.parser.ParseException;
|
||||||
|
import nu.zoom.tapir.parser.SimpleNode;
|
||||||
|
import nu.zoom.tapir.parser.TapirParserTreeConstants;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class NodeTransformer {
|
||||||
|
|
||||||
|
public static List<EndpointNode> transform(SimpleNode rootNode) throws ParseException {
|
||||||
|
ArrayList<EndpointNode> endpoints = new ArrayList<>();
|
||||||
|
for (int i = 0; i < rootNode.jjtGetNumChildren(); i++) {
|
||||||
|
SimpleNode endpoint = assertSimpleNode(rootNode.jjtGetChild(i));
|
||||||
|
endpoints.add(handleEndpoint(endpoint));
|
||||||
|
}
|
||||||
|
return endpoints ;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static EndpointNode handleEndpoint(SimpleNode node) throws ParseException {
|
||||||
|
int numChildren = node.jjtGetNumChildren();
|
||||||
|
if (numChildren != 2) {
|
||||||
|
throw new ParseException("Endpoint node should have two children but had: " + numChildren);
|
||||||
|
}
|
||||||
|
SimpleNode pathsParseNode =
|
||||||
|
assertSimpleNodeType(
|
||||||
|
node.jjtGetChild(0),
|
||||||
|
TapirParserTreeConstants.JJTPATHS
|
||||||
|
);
|
||||||
|
PathsNode pathsNode = handlePaths(pathsParseNode);
|
||||||
|
SimpleNode handlerParseNode =
|
||||||
|
assertSimpleNodeType(
|
||||||
|
node.jjtGetChild(1),
|
||||||
|
TapirParserTreeConstants.JJTHANDLERSPEC
|
||||||
|
);
|
||||||
|
HandlerNode handlerNode = handleHandler(handlerParseNode);
|
||||||
|
return new EndpointNode(pathsNode, handlerNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HandlerNode handleHandler(SimpleNode handlerSpec) throws ParseException {
|
||||||
|
int numChildren = handlerSpec.jjtGetNumChildren();
|
||||||
|
if (numChildren != 2) {
|
||||||
|
throw new ParseException("HandlerSpec-node should have two children but had: " + numChildren);
|
||||||
|
}
|
||||||
|
String handlerName = getStringValue(
|
||||||
|
assertSimpleNodeType(
|
||||||
|
handlerSpec.jjtGetChild(0),
|
||||||
|
TapirParserTreeConstants.JJTHANDLERNAME
|
||||||
|
)
|
||||||
|
);
|
||||||
|
SimpleNode payloadFieldsParseNode =
|
||||||
|
assertSimpleNodeType(
|
||||||
|
handlerSpec.jjtGetChild(1),
|
||||||
|
TapirParserTreeConstants.JJTPAYLOADFIELDS
|
||||||
|
);
|
||||||
|
List<FieldNode> fields = handleFields(payloadFieldsParseNode);
|
||||||
|
return new HandlerNode(handlerName, fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<FieldNode> handleFields(SimpleNode payloadFieldsParseNode) throws ParseException {
|
||||||
|
ArrayList<FieldNode> fields = new ArrayList<>();
|
||||||
|
for (int i = 0; i < payloadFieldsParseNode.jjtGetNumChildren(); i++) {
|
||||||
|
SimpleNode payloadFieldParseNode =
|
||||||
|
assertSimpleNodeType(
|
||||||
|
payloadFieldsParseNode.jjtGetChild(i),
|
||||||
|
TapirParserTreeConstants.JJTPAYLOADFIELD
|
||||||
|
);
|
||||||
|
int numFieldNodes = payloadFieldParseNode.jjtGetNumChildren();
|
||||||
|
if (numFieldNodes != 2) {
|
||||||
|
throw new ParseException("Field-node should have two children but had: " + numFieldNodes);
|
||||||
|
}
|
||||||
|
String fieldName = getStringValue(
|
||||||
|
assertSimpleNodeType(
|
||||||
|
payloadFieldParseNode.jjtGetChild(0),
|
||||||
|
TapirParserTreeConstants.JJTPAYLOADFIELDNAME
|
||||||
|
)
|
||||||
|
);
|
||||||
|
String fieldType = getStringValue(
|
||||||
|
assertSimpleNodeType(
|
||||||
|
payloadFieldParseNode.jjtGetChild(1),
|
||||||
|
TapirParserTreeConstants.JJTPAYLOADFIELDTYPE
|
||||||
|
)
|
||||||
|
);
|
||||||
|
fields.add(new FieldNode(fieldName, fieldType));
|
||||||
|
}
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static PathsNode handlePaths(SimpleNode pathsParseNode) throws ParseException {
|
||||||
|
int numPathSegments = pathsParseNode.jjtGetNumChildren();
|
||||||
|
ArrayList<String> segments = new ArrayList<>();
|
||||||
|
for (int i = 0; i < numPathSegments; i++) {
|
||||||
|
SimpleNode segmentParseNode = assertSimpleNodeType(pathsParseNode.jjtGetChild(i), TapirParserTreeConstants.JJTPATH);
|
||||||
|
segments.add(getStringValue(segmentParseNode));
|
||||||
|
}
|
||||||
|
return new PathsNode(segments);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static SimpleNode assertSimpleNodeType(Node node, int nodeType) throws ParseException {
|
||||||
|
SimpleNode result = assertSimpleNode(node);
|
||||||
|
if (result.getId() != nodeType) {
|
||||||
|
throw new ParseException(
|
||||||
|
"Expected Node of type " +
|
||||||
|
TapirParserTreeConstants.jjtNodeName[nodeType]
|
||||||
|
+ " but was " + TapirParserTreeConstants.jjtNodeName[result.getId()]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static SimpleNode assertSimpleNode(Node node) throws ParseException {
|
||||||
|
if (node instanceof SimpleNode) {
|
||||||
|
return (SimpleNode) node;
|
||||||
|
}
|
||||||
|
throw new ParseException("Expected Node to be a " + SimpleNode.class + " but found " + node.getClass());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getStringValue(SimpleNode node) throws ParseException {
|
||||||
|
Object value = node.jjtGetValue();
|
||||||
|
if (value instanceof String) {
|
||||||
|
return (String) value;
|
||||||
|
}
|
||||||
|
throw new ParseException("Expected Node " + node + " to have a String value but was " + value.getClass());
|
||||||
|
}
|
||||||
|
}
|
6
parser/src/main/java/nu/zoom/state/PathsNode.java
Normal file
6
parser/src/main/java/nu/zoom/state/PathsNode.java
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
package nu.zoom.state;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public record PathsNode(List<String> paths) {
|
||||||
|
}
|
38
parser/src/main/java/nu/zoom/state/TargetGenerator.java
Normal file
38
parser/src/main/java/nu/zoom/state/TargetGenerator.java
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
package nu.zoom.state;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class TargetGenerator {
|
||||||
|
private final Path outputPath;
|
||||||
|
private final Path templatePath;
|
||||||
|
|
||||||
|
public static class TargetGeneratorException extends Exception {
|
||||||
|
public TargetGeneratorException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
public TargetGeneratorException(Exception cause) {
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public TargetGenerator(
|
||||||
|
Path outputPath,
|
||||||
|
Path templatePath,
|
||||||
|
List<EndpointNode> endpoints
|
||||||
|
) {
|
||||||
|
this.outputPath = Objects.requireNonNull(
|
||||||
|
outputPath,
|
||||||
|
"Output path is required"
|
||||||
|
);
|
||||||
|
this.templatePath = Objects.requireNonNull(
|
||||||
|
templatePath,
|
||||||
|
"Template path is required"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void generate() throws TargetGeneratorException {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
0
tapir-templates/endpoints.ftl
Normal file
0
tapir-templates/endpoints.ftl
Normal file
Loading…
Add table
Add a link
Reference in a new issue