diff --git a/parser/src/main/antlr4/nu/zoom/dsl/parser/Endpoints.g4 b/parser/src/main/antlr4/nu/zoom/dsl/parser/Endpoints.g4 index 52edd2e..c1bd90b 100644 --- a/parser/src/main/antlr4/nu/zoom/dsl/parser/Endpoints.g4 +++ b/parser/src/main/antlr4/nu/zoom/dsl/parser/Endpoints.g4 @@ -6,7 +6,7 @@ configkey : IDENTIFIER ; configvalue : (IDENTIFIER|VALUE) ; namedTypeDeclaration : typeName typeDeclaration ; typeName : IDENTIFIER ; -typeDeclaration : typeName? '(' typeField (',' typeField)* ')' ; +typeDeclaration : '(' typeField (',' typeField)* ')' ; typeField : fieldName ':' fieldType ; fieldName : IDENTIFIER ; fieldType : IDENTIFIER ; diff --git a/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java b/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java index 556a23c..51b0854 100644 --- a/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java +++ b/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java @@ -56,8 +56,24 @@ public class EndpointsVisitorTransformer extends EndpointsBaseVisitor<EndpointsP var endpoint = new EndpointNode(new PathsNode(segments), typeReference.getText()); this.endpoints.add(endpoint); } else { - var compoundTypeNode = extractCompoundTypeNode(ctx.requestBody().namedTypeDeclaration()); - var endpoint = new EndpointNode(new PathsNode(segments), compoundTypeNode.name().orElseThrow()); + EndpointsParser.RequestBodyContext requestBodyContext = ctx.requestBody() ; + String requestTypeName = null ; + // request can be either a named type declaration, an anonymous type declaration or a type reference + if (requestBodyContext.namedTypeDeclaration() != null) { + var compoundTypeNode = extractCompoundTypeNode(ctx.requestBody().namedTypeDeclaration()); + requestTypeName = compoundTypeNode.name() ; + this.dataTypes.add(compoundTypeNode); + } else if (requestBodyContext.typeDeclaration() != null) { + var typeFields = extractTypeFields(requestBodyContext.typeDeclaration().typeField()) ; + requestTypeName = segments.getLast() + "Request" ; + this.dataTypes.add(new TypeNode(requestTypeName, typeFields)); + } else if (requestBodyContext.IDENTIFIER() != null) { + requestTypeName = requestBodyContext.IDENTIFIER().getText() ; + } + if (requestTypeName == null) { + throw new ParseException("Unable to create the request body data type" + ctx.toStringTree()) ; + } + var endpoint = new EndpointNode(new PathsNode(segments), requestTypeName); this.endpoints.add(endpoint); } } @@ -65,7 +81,7 @@ public class EndpointsVisitorTransformer extends EndpointsBaseVisitor<EndpointsP private TypeNode extractCompoundTypeNode(EndpointsParser.NamedTypeDeclarationContext ctx) { String typeName = ctx.typeName().getText(); List<FieldNode> fields = extractTypeFields(ctx.typeDeclaration().typeField()); - return new TypeNode(Optional.of(typeName), fields); + return new TypeNode(typeName, fields); } private List<FieldNode> extractTypeFields(List<EndpointsParser.TypeFieldContext> compoundFieldContexts) { diff --git a/parser/src/main/java/nu/zoom/dsl/ast/ParseException.java b/parser/src/main/java/nu/zoom/dsl/ast/ParseException.java new file mode 100644 index 0000000..d9dde07 --- /dev/null +++ b/parser/src/main/java/nu/zoom/dsl/ast/ParseException.java @@ -0,0 +1,7 @@ +package nu.zoom.dsl.ast; + +public class ParseException extends RuntimeException { + public ParseException(String message) { + super(message); + } +} diff --git a/parser/src/main/java/nu/zoom/dsl/ast/TypeNode.java b/parser/src/main/java/nu/zoom/dsl/ast/TypeNode.java index 1e76b1a..095da4f 100644 --- a/parser/src/main/java/nu/zoom/dsl/ast/TypeNode.java +++ b/parser/src/main/java/nu/zoom/dsl/ast/TypeNode.java @@ -3,5 +3,5 @@ package nu.zoom.dsl.ast; import java.util.List; import java.util.Optional; -public record TypeNode(Optional<String> name, List<FieldNode> fields) { +public record TypeNode(String name, List<FieldNode> fields) { } diff --git a/test01.endpoints b/test01.endpoints index c60ce61..aa8ff9a 100644 --- a/test01.endpoints +++ b/test01.endpoints @@ -1,2 +1,5 @@ -/some/endpoint =< SomeType(foo:String) -/some/other/endpoint =< SomeOtherType(bar:Seq[Embedded]) \ No newline at end of file +AType(data: List[String]) + +/some/endpoint <- SomeType(foo:String) +/some/other/endpoint <- SomeOtherType(bar:Seq[Embedded]) +/yet/other/endpoint <- (bar:Seq[Embedded]) \ No newline at end of file