From 7e16a1f58cfce6652b4a12993fce6db176cb40fc Mon Sep 17 00:00:00 2001 From: Erik Timmers Date: Fri, 24 Jan 2020 11:04:00 +0100 Subject: [PATCH] [elm] Fix duplicate coder names (#5100) * [elm] Add signature to enum variants * [elm] Fix field encoders/decoders --- .../codegen/languages/ElmClientCodegen.java | 23 +++++++++++++++---- .../main/resources/elm/customType.mustache | 1 + .../main/resources/elm/fieldDecoder.mustache | 18 ++++++++++++++- .../main/resources/elm/fieldEncoder.mustache | 18 ++++++++++++++- .../src/main/resources/elm/operation.mustache | 2 +- .../src/test/resources/3_0/elm.yaml | 16 +++++++++++++ samples/openapi3/client/elm/src/Api/Data.elm | 2 ++ .../client/elm/src/Api/Request/Default.elm | 18 +++++++++++++++ 8 files changed, 91 insertions(+), 7 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java index bbaa110b3f7..11652306daa 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java @@ -17,11 +17,12 @@ package org.openapitools.codegen.languages; +import com.google.common.collect.ImmutableMap; +import com.samskivert.mustache.Mustache; +import com.samskivert.mustache.Mustache.Lambda; +import com.samskivert.mustache.Template; import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.Schema; -import io.swagger.v3.oas.models.responses.ApiResponse; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.*; import org.openapitools.codegen.meta.features.*; import org.openapitools.codegen.utils.ModelUtils; @@ -29,7 +30,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; -import java.text.Collator; +import java.io.IOException; +import java.io.Writer; import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -156,6 +158,12 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); } + @Override + protected ImmutableMap.Builder addMustacheLambdas() { + return super.addMustacheLambdas() + .put("removeWhitespace", new RemoveWhitespaceLambda()); + } + @Override public String escapeUnsafeCharacters(String input) { return input.replace("*/", "*_/").replace("/*", "/_*"); @@ -425,4 +433,11 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { } return super.getTypeDeclaration(p); } + + private static class RemoveWhitespaceLambda implements Mustache.Lambda { + @Override + public void execute(final Template.Fragment fragment, final Writer writer) throws IOException { + writer.write(fragment.execute().replaceAll("\\s+", "")); + } + } } diff --git a/modules/openapi-generator/src/main/resources/elm/customType.mustache b/modules/openapi-generator/src/main/resources/elm/customType.mustache index 42a2b12d7f9..ea6477b6618 100644 --- a/modules/openapi-generator/src/main/resources/elm/customType.mustache +++ b/modules/openapi-generator/src/main/resources/elm/customType.mustache @@ -6,6 +6,7 @@ type {{^paramName}}{{classname}}{{/paramName}}{{enumName}} {{/allowableValues}} +{{#lambda.camelcase}}{{^paramName}}{{classname}}{{/paramName}}{{enumName}}{{/lambda.camelcase}}Variants : List {{^paramName}}{{classname}}{{/paramName}}{{enumName}} {{#lambda.camelcase}}{{^paramName}}{{classname}}{{/paramName}}{{enumName}}{{/lambda.camelcase}}Variants = {{#allowableValues}} {{#enumVars}} diff --git a/modules/openapi-generator/src/main/resources/elm/fieldDecoder.mustache b/modules/openapi-generator/src/main/resources/elm/fieldDecoder.mustache index 20132a3c7ca..7495eb50c77 100644 --- a/modules/openapi-generator/src/main/resources/elm/fieldDecoder.mustache +++ b/modules/openapi-generator/src/main/resources/elm/fieldDecoder.mustache @@ -1 +1,17 @@ -{{#isDateTime}}Api.Time.dateTimeDecoder{{/isDateTime}}{{#isDate}}Api.Time.dateDecoder{{/isDate}}{{#isByteArray}}Json.Decode.string{{/isByteArray}}{{#isBinary}}Json.Decode.string{{/isBinary}}{{#isString}}{{^isEnum}}{{^isUuid}}Json.Decode.string{{/isUuid}}{{/isEnum}}{{/isString}}{{#isInteger}}Json.Decode.int{{/isInteger}}{{#isLong}}Json.Decode.int{{/isLong}}{{#isNumber}}Json.Decode.float{{/isNumber}}{{#isFloat}}Json.Decode.float{{/isFloat}}{{#isDouble}}Json.Decode.float{{/isDouble}}{{#isBoolean}}Json.Decode.bool{{/isBoolean}}{{#isUuid}}Uuid.decoder{{/isUuid}}{{^isString}}{{^isNumeric}}{{^isBoolean}}{{#isDefault}}Api.Data.{{/isDefault}}{{#lambda.camelcase}}{{#isEnum}}{{classname}}{{enumName}}{{/isEnum}}{{^isEnum}}{{dataType}}{{/isEnum}}{{/lambda.camelcase}}Decoder{{/isBoolean}}{{/isNumeric}}{{/isString}} \ No newline at end of file +{{#lambda.removeWhitespace}} +{{#isDateTime}}Api.Time.dateTimeDecoder{{/isDateTime}} +{{#isDate}}Api.Time.dateDecoder{{/isDate}} +{{#isByteArray}}Json.Decode.string{{/isByteArray}} +{{#isBinary}}Json.Decode.string{{/isBinary}} +{{#isString}}{{^isEnum}}{{^isUuid}}Json.Decode.string{{/isUuid}}{{/isEnum}}{{/isString}} +{{#isInteger}}Json.Decode.int{{/isInteger}} +{{#isLong}}Json.Decode.int{{/isLong}} +{{#isNumber}}Json.Decode.float{{/isNumber}} +{{#isFloat}}Json.Decode.float{{/isFloat}} +{{#isDouble}}Json.Decode.float{{/isDouble}} +{{#isBoolean}}Json.Decode.bool{{/isBoolean}} +{{#isUuid}}Uuid.decoder{{/isUuid}} +{{^isDateTime}}{{^isDate}}{{^isByteArray}}{{^isBinary}}{{^isString}}{{^isNumeric}}{{^isBoolean}}{{^isUuid}} +{{#isDefault}}Api.Data.{{/isDefault}}{{#lambda.camelcase}}{{#isEnum}}{{classname}}{{enumName}}{{/isEnum}}{{^isEnum}}{{dataType}}{{/isEnum}}{{/lambda.camelcase}}Decoder +{{/isUuid}}{{/isBoolean}}{{/isNumeric}}{{/isString}}{{/isBinary}}{{/isByteArray}}{{/isDate}}{{/isDateTime}} +{{/lambda.removeWhitespace}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/elm/fieldEncoder.mustache b/modules/openapi-generator/src/main/resources/elm/fieldEncoder.mustache index bb3db523688..9ae836c6169 100644 --- a/modules/openapi-generator/src/main/resources/elm/fieldEncoder.mustache +++ b/modules/openapi-generator/src/main/resources/elm/fieldEncoder.mustache @@ -1 +1,17 @@ -{{#isDateTime}}Api.Time.encodeDateTime{{/isDateTime}}{{#isDate}}Api.Time.encodeDate{{/isDate}}{{#isByteArray}}Json.Encode.string{{/isByteArray}}{{#isBinary}}Json.Decode.string{{/isBinary}}{{#isString}}{{^isEnum}}{{^isUuid}}Json.Encode.string{{/isUuid}}{{/isEnum}}{{/isString}}{{#isInteger}}Json.Encode.int{{/isInteger}}{{#isLong}}Json.Encode.int{{/isLong}}{{#isNumber}}Json.Encode.float{{/isNumber}}{{#isFloat}}Json.Encode.float{{/isFloat}}{{#isDouble}}Json.Encode.float{{/isDouble}}{{#isBoolean}}Json.Encode.bool{{/isBoolean}}{{#isUuid}}Uuid.encode{{/isUuid}}{{^isString}}{{^isNumeric}}{{^isBoolean}}{{#lambda.camelcase}}encode{{#isEnum}}{{classname}}{{enumName}}{{/isEnum}}{{^isEnum}}{{dataType}}{{/isEnum}}{{/lambda.camelcase}}{{/isBoolean}}{{/isNumeric}}{{/isString}} \ No newline at end of file +{{#lambda.removeWhitespace}} +{{#isDateTime}}Api.Time.encodeDateTime{{/isDateTime}} +{{#isDate}}Api.Time.encodeDate{{/isDate}} +{{#isByteArray}}Json.Encode.string{{/isByteArray}} +{{#isBinary}}Json.Decode.string{{/isBinary}} +{{#isString}}{{^isEnum}}{{^isUuid}}Json.Encode.string{{/isUuid}}{{/isEnum}}{{/isString}} +{{#isInteger}}Json.Encode.int{{/isInteger}} +{{#isLong}}Json.Encode.int{{/isLong}} +{{#isNumber}}Json.Encode.float{{/isNumber}} +{{#isFloat}}Json.Encode.float{{/isFloat}} +{{#isDouble}}Json.Encode.float{{/isDouble}} +{{#isBoolean}}Json.Encode.bool{{/isBoolean}} +{{#isUuid}}Uuid.encode{{/isUuid}} +{{^isDateTime}}{{^isDate}}{{^isByteArray}}{{^isBinary}}{{^isString}}{{^isNumeric}}{{^isBoolean}}{{^isUuid}} +{{#lambda.camelcase}}encode{{#isEnum}}{{classname}}{{enumName}}{{/isEnum}}{{^isEnum}}{{dataType}}{{/isEnum}}{{/lambda.camelcase}} +{{/isUuid}}{{/isBoolean}}{{/isNumeric}}{{/isString}}{{/isBinary}}{{/isByteArray}}{{/isDate}}{{/isDateTime}} +{{/lambda.removeWhitespace}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/elm/operation.mustache b/modules/openapi-generator/src/main/resources/elm/operation.mustache index 3bc12acf233..a5da2f70f1e 100644 --- a/modules/openapi-generator/src/main/resources/elm/operation.mustache +++ b/modules/openapi-generator/src/main/resources/elm/operation.mustache @@ -33,7 +33,7 @@ import Uuid exposing (Uuid){{/includeUuid}} {-| {{{notes}}} -} {{/notes}} -{{operationId}} : {{#allParams}}{{^required}}Maybe {{/required}}{{#isListContainer}}List {{/isListContainer}}{{#datatypeWithEnum}}{{.}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{#isModel}}Api.Data.{{/isModel}}{{dataType}}{{/datatypeWithEnum}} -> {{/allParams}}Api.Request {{^responses}}(){{/responses}}{{#responses}}{{#-first}}{{^dataType}}(){{/dataType}}{{#isMapContainer}}(Dict.Dict String {{/isMapContainer}}{{#isListContainer}}(List {{/isListContainer}}{{^primitiveType}}Api.Data.{{/primitiveType}}{{#items}}{{#isModel}}Api.Data.{{/isModel}}{{/items}}{{dataType}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/-first}}{{/responses}} +{{operationId}} : {{#allParams}}{{^required}}Maybe {{/required}}{{#isListContainer}}List {{/isListContainer}}{{#datatypeWithEnum}}{{.}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{#isModel}}Api.Data.{{/isModel}}{{dataType}}{{/datatypeWithEnum}} -> {{/allParams}}Api.Request {{^responses}}(){{/responses}}{{#responses}}{{#-first}}{{^dataType}}(){{/dataType}}{{#isMapContainer}}(Dict.Dict String {{/isMapContainer}}{{#isListContainer}}(List {{/isListContainer}}{{^primitiveType}}{{^isUuid}}Api.Data.{{/isUuid}}{{/primitiveType}}{{#items}}{{#isModel}}Api.Data.{{/isModel}}{{/items}}{{dataType}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/-first}}{{/responses}} {{operationId}}{{#allParams}} {{>paramName}}{{/allParams}} = Api.request "{{httpMethod}}" diff --git a/modules/openapi-generator/src/test/resources/3_0/elm.yaml b/modules/openapi-generator/src/test/resources/3_0/elm.yaml index add5576b407..22f74690fe1 100644 --- a/modules/openapi-generator/src/test/resources/3_0/elm.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/elm.yaml @@ -97,6 +97,22 @@ paths: responses: "200": description: Default response + /uuid: + get: + parameters: + - name: value + in: query + schema: + type: string + format: uuid + responses: + "200": + description: Default response + content: + application/json: + schema: + type: string + format: uuid components: schemas: Absent: diff --git a/samples/openapi3/client/elm/src/Api/Data.elm b/samples/openapi3/client/elm/src/Api/Data.elm index 262d799513e..df7113ce37b 100644 --- a/samples/openapi3/client/elm/src/Api/Data.elm +++ b/samples/openapi3/client/elm/src/Api/Data.elm @@ -140,6 +140,7 @@ type Enum | EnumBaz +enumVariants : List Enum enumVariants = [ EnumFoo , EnumBar @@ -153,6 +154,7 @@ type Enumeric | Enumeric3 +enumericVariants : List Enumeric enumericVariants = [ Enumeric1 , Enumeric2 diff --git a/samples/openapi3/client/elm/src/Api/Request/Default.elm b/samples/openapi3/client/elm/src/Api/Request/Default.elm index 89b5e57b681..5dcdf717a7b 100644 --- a/samples/openapi3/client/elm/src/Api/Request/Default.elm +++ b/samples/openapi3/client/elm/src/Api/Request/Default.elm @@ -18,6 +18,7 @@ module Api.Request.Default exposing , maybeGet , pathStringIntegerEnumerationGet, Enumeration(..), enumerationVariants , queryGet, Enum(..), enumVariants + , uuidGet ) import Api @@ -26,6 +27,7 @@ import Dict import Http import Json.Decode import Json.Encode +import Uuid exposing (Uuid) type HeaderType @@ -33,6 +35,7 @@ type HeaderType | HeaderTypeRight +headerTypeVariants : List HeaderType headerTypeVariants = [ HeaderTypeLeft , HeaderTypeRight @@ -57,6 +60,7 @@ type Enumeration | EnumerationC +enumerationVariants : List Enumeration enumerationVariants = [ EnumerationA , EnumerationB @@ -85,6 +89,7 @@ type Enum | EnumC +enumVariants : List Enum enumVariants = [ EnumA , EnumB @@ -157,3 +162,16 @@ queryGet string_query int_query enum_query = [] Nothing (Json.Decode.succeed ()) + + + +uuidGet : Maybe Uuid -> Api.Request Uuid +uuidGet value_query = + Api.request + "GET" + "/uuid" + [] + [ ( "value", Maybe.map Uuid.toString value_query ) ] + [] + Nothing + Uuid.decoder