From 20aa2becfb5b85d6bb131e581a6d2a75ce502d44 Mon Sep 17 00:00:00 2001 From: Johan Maasing Date: Thu, 20 Mar 2025 19:22:41 +0100 Subject: [PATCH] Remove handler name, use the last path segment to name the payload class --- endpoints.tapir | 5 ++--- .../main/java/nu/zoom/tapir/NodeTransformer.java | 5 +++-- .../main/java/nu/zoom/tapir/TargetGenerator.java | 11 ++++++----- parser/src/main/jjtree/tapir.jjt | 2 +- tapir-templates/codec.ftl | 8 ++++++++ tapir-templates/endpoints.ftl | 15 ++++----------- 6 files changed, 24 insertions(+), 22 deletions(-) create mode 100644 tapir-templates/codec.ftl diff --git a/endpoints.tapir b/endpoints.tapir index 3edbd87..19eeef3 100644 --- a/endpoints.tapir +++ b/endpoints.tapir @@ -1,15 +1,14 @@ ProjektProperties( - id: String, title: String, description: String ) -/projekt/create -> createProjekt( +/createProject -> ( id: ProjektId, properties: ProjektProperties ) -/projekt/update -> updateProjekt( +/updateProject -> ( id: ProjektId, properties: ProjektProperties ) \ No newline at end of file diff --git a/parser/src/main/java/nu/zoom/tapir/NodeTransformer.java b/parser/src/main/java/nu/zoom/tapir/NodeTransformer.java index f0d3462..942465d 100644 --- a/parser/src/main/java/nu/zoom/tapir/NodeTransformer.java +++ b/parser/src/main/java/nu/zoom/tapir/NodeTransformer.java @@ -114,9 +114,10 @@ public class NodeTransformer { SimpleNode handlerParseNode = assertSimpleNodeType( node.jjtGetChild(1), - TapirParserTreeConstants.JJTCOMPOUNDDATATYPE + TapirParserTreeConstants.JJTDATATYPEFIELDS ); - HandlerNode handlerNode = handleHandler(handlerParseNode); + List fields = handleFields(handlerParseNode); + HandlerNode handlerNode = new HandlerNode(pathsNode.paths().getLast(), fields); return new EndpointNode(pathsNode, handlerNode); } diff --git a/parser/src/main/java/nu/zoom/tapir/TargetGenerator.java b/parser/src/main/java/nu/zoom/tapir/TargetGenerator.java index 537d132..c47d4e2 100644 --- a/parser/src/main/java/nu/zoom/tapir/TargetGenerator.java +++ b/parser/src/main/java/nu/zoom/tapir/TargetGenerator.java @@ -56,25 +56,26 @@ public class TargetGenerator { cfg.setLogTemplateExceptions(false); cfg.setWrapUncheckedExceptions(true); cfg.setFallbackOnNullLoopVariable(false); - Template temp = cfg.getTemplate(ENDPOINTS_TEMPLATE_NAME); List templates = Files .list(this.templatePath) .filter(Files::isRegularFile) .filter(f -> f.getFileName().toString().endsWith(".ftl")) .toList() ; - for (Path template : templates) { + for (Path templatePath : templates) { try (var outputFile = Files.newBufferedWriter( - outputName(template), + outputName(templatePath), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING )) { if (this.verbose) { - System.out.println("Processing " + template); + System.out.println("Processing " + templatePath); } HashMap templateData = new HashMap<>(); templateData.put("endpoints", endpoints); templateData.put("datatypes", dataTypes); - temp.process(templateData, outputFile); + cfg.getTemplate( + templatePath.getFileName().toString() + ).process(templateData, outputFile); } } } catch (TemplateException | IOException ex) { diff --git a/parser/src/main/jjtree/tapir.jjt b/parser/src/main/jjtree/tapir.jjt index 55ce140..4f38e04 100755 --- a/parser/src/main/jjtree/tapir.jjt +++ b/parser/src/main/jjtree/tapir.jjt @@ -90,7 +90,7 @@ void dataTypes() : void endpoint() : {} { - path() compoundDataType() + path() dataTypeFields() } void endpoints() : diff --git a/tapir-templates/codec.ftl b/tapir-templates/codec.ftl new file mode 100644 index 0000000..ec48ffe --- /dev/null +++ b/tapir-templates/codec.ftl @@ -0,0 +1,8 @@ +object Codecs: + +<#list datatypes as datatype> + given Codec[${datatype.name?cap_first}] = deriveCodec + +<#list endpoints as endpoint> + given Codec[${endpoint.handler.name?cap_first}Payload] = deriveCodec + \ No newline at end of file diff --git a/tapir-templates/endpoints.ftl b/tapir-templates/endpoints.ftl index 64805ae..7a01e51 100644 --- a/tapir-templates/endpoints.ftl +++ b/tapir-templates/endpoints.ftl @@ -1,4 +1,4 @@ -package se.senashdev.projekt.api +package se.senashdev.project.api import se.rutdev.projekt.api.HttpProtocol.VersionedResponse import se.rutdev.framework.json.circe.RutUtilsCodec @@ -19,22 +19,15 @@ class Endpoints(override val config: OAuthUtils.OAuthConfig) extends framework.s <#list endpoints as endpoint> - case class ${endpoint.handler.name?cap_first}( + case class ${endpoint.handler.name?cap_first}Payload( <#list endpoint.handler.fields as field> ${field.name} : ${field.type}, ) - <#list datatypes as datatype> - given Codec[${datatype.name?cap_first}] = deriveCodec - <#list endpoints as endpoint> - given Codec[${endpoint.handler.name?cap_first}] = deriveCodec - - - <#list endpoints as endpoint> - val ${endpoint.handler.name}Endpoint = ApiEndpoint[${endpoint.handler.name?cap_first}, VersionedResponse] = + val ${endpoint.handler.name}Endpoint = ApiEndpoint[${endpoint.handler.name?cap_first}Payload, VersionedResponse] = <#list endpoint.paths.paths> apiV1Endpoint .post @@ -42,7 +35,7 @@ class Endpoints(override val config: OAuthUtils.OAuthConfig) extends framework.s .in("${segment}") .post - .in(jsonBody[${endpoint.handler.name?cap_first}]) + .in(jsonBody[${endpoint.handler.name?cap_first}Payload]) .out(jsonBody[VersionedResponse])