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 09942d6fb88..cbdee397d7c 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 @@ -87,7 +87,14 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { defaultIncludes = new HashSet<>( Arrays.asList( - "List") + "Order", + "Never", + "List", + "Maybe", + "Result", + "Program", + "Cmd", + "Sub") ); languageSpecificPrimitives = new HashSet<>( @@ -158,7 +165,8 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String toModelName(String name) { - return camelize(name); + final String modelName = camelize(name); + return defaultIncludes.contains(modelName) ? modelName + "_" : modelName; } @Override @@ -262,10 +270,10 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { for (Map mo : models) { CodegenModel cm = (CodegenModel) mo.get("model"); if (cm.isEnum) { - this.addEncoderAndDecoder(cm.vendorExtensions, cm.classname, false); + this.addEncoderAndDecoder(cm.vendorExtensions, cm.classname, false, false); cm.vendorExtensions.put(X_UNION_TYPE, cm.classname); } else if (cm.isAlias) { - this.addEncoderAndDecoder(cm.vendorExtensions, cm.dataType, true); + this.addEncoderAndDecoder(cm.vendorExtensions, cm.dataType, false, true); } List elmImports = new ArrayList<>(); @@ -380,7 +388,7 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { } op.path = ("\"" + path + "\"").replaceAll(" \\+\\+ \"\"", ""); - if (op.bodyParam != null) { + if (op.bodyParam != null && !op.bodyParam.isPrimitiveType && !op.bodyParam.isMapContainer) { final String encoder = (String) op.bodyParam.vendorExtensions.get(X_ENCODER); if (encoder != null) { if (!dependencies.containsKey(op.bodyParam.dataType)) { @@ -390,6 +398,9 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { } } for (CodegenResponse resp : op.responses) { + if (resp.primitiveType || resp.isMapContainer) { + continue; + } final String decoder = (String) resp.vendorExtensions.get(X_DECODER); if (decoder != null) { if (!dependencies.containsKey(resp.dataType)) { @@ -486,7 +497,7 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { final CodegenProperty property = super.fromProperty(name, p); final String dataType = property.isEnum ? property.baseName : property.datatype; - addEncoderAndDecoder(property.vendorExtensions, dataType, property.isPrimitiveType && !property.isEnum); + addEncoderAndDecoder(property.vendorExtensions, dataType, property.isMapContainer, property.isPrimitiveType && !property.isEnum); if (property.isEnum) { property.vendorExtensions.put(X_UNION_TYPE, property.datatypeWithEnum); } @@ -498,17 +509,24 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { public CodegenResponse fromResponse(String responseCode, ApiResponse resp) { final CodegenResponse response = super.fromResponse(responseCode, resp); if (response.dataType != null) { - addEncoderAndDecoder(response.vendorExtensions, response.dataType, response.primitiveType); + addEncoderAndDecoder(response.vendorExtensions, response.dataType, response.isMapContainer, response.primitiveType); } return response; } @Override public void postProcessParameter(CodegenParameter parameter) { - addEncoderAndDecoder(parameter.vendorExtensions, parameter.dataType, parameter.isPrimitiveType); + addEncoderAndDecoder(parameter.vendorExtensions, parameter.dataType, parameter.isMapContainer, parameter.isPrimitiveType); } - private void addEncoderAndDecoder(Map vendorExtensions, String dataType, Boolean isPrimitiveType) { + private boolean isPrimitiveDataType(String dataType) { + return languageSpecificPrimitives.contains(dataType); + } + + private void addEncoderAndDecoder(Map vendorExtensions, String dataType, Boolean isMapContainer, Boolean isPrimitiveType) { + if (isMapContainer) { + isPrimitiveType = isPrimitiveDataType(dataType); + } final String baseName = camelize(dataType, true); String encoderName; String decoderName; diff --git a/modules/openapi-generator/src/main/resources/elm/Byte.mustache b/modules/openapi-generator/src/main/resources/elm/Byte.mustache index 44413db12c4..6974f1ed59b 100644 --- a/modules/openapi-generator/src/main/resources/elm/Byte.mustache +++ b/modules/openapi-generator/src/main/resources/elm/Byte.mustache @@ -4,7 +4,8 @@ import Json.Decode as Decode exposing (Decoder) import Json.Encode as Encode -type alias Byte = String +type alias Byte = + String byteDecoder : Decoder Byte diff --git a/modules/openapi-generator/src/main/resources/elm/api.mustache b/modules/openapi-generator/src/main/resources/elm/api.mustache index 1bccae9d146..a9f34811432 100644 --- a/modules/openapi-generator/src/main/resources/elm/api.mustache +++ b/modules/openapi-generator/src/main/resources/elm/api.mustache @@ -2,7 +2,8 @@ module Request.{{classname}} exposing ({{#operations}}{{#operation}}{{^-first}}, {{/-first}}{{operationId}}{{/operation}}{{/operations}}) -{{>imports}}import Http +{{>imports}}import Dict +import Http import Json.Decode as Decode @@ -16,13 +17,13 @@ basePath = {- {{notes}} -} -{{operationId}} : {{#pathParams}}{{dataType}} -> {{/pathParams}}{{#bodyParam}}{{dataType}} -> {{/bodyParam}}Http.Request {{#responses}}{{#-first}}{{^dataType}}(){{/dataType}}{{#isListContainer}}(List {{/isListContainer}}{{dataType}}{{#isListContainer}}){{/isListContainer}}{{/-first}}{{/responses}} +{{operationId}} : {{#pathParams}}{{dataType}} -> {{/pathParams}}{{#bodyParam}}{{dataType}} -> {{/bodyParam}}Http.Request {{#responses}}{{#-first}}{{^dataType}}(){{/dataType}}{{#isMapContainer}}(Dict.Dict String {{/isMapContainer}}{{#isListContainer}}(List {{/isListContainer}}{{dataType}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/-first}}{{/responses}} {{operationId}} {{#pathParams}}{{paramName}} {{/pathParams}}{{#bodyParam}}model {{/bodyParam}}= { method = "{{httpMethod}}" , url = basePath ++ {{{path}}} , headers = [] , body = {{#bodyParam}}Http.jsonBody <| {{vendorExtensions.x-encoder}} model{{/bodyParam}}{{^bodyParam}}Http.emptyBody{{/bodyParam}} - , expect = {{#responses}}{{#-first}}{{^dataType}}Http.expectStringResponse (\_ -> Ok ()){{/dataType}}{{#dataType}}Http.expectJson {{#isListContainer}}(Decode.list {{/isListContainer}}{{#vendorExtensions}}{{x-decoder}}{{/vendorExtensions}}{{#isListContainer}}){{/isListContainer}}{{/dataType}}{{/-first}}{{/responses}} + , expect = {{#responses}}{{#-first}}{{^dataType}}Http.expectStringResponse (\_ -> Ok ()){{/dataType}}{{#dataType}}Http.expectJson {{#isMapContainer}}(Decode.dict {{/isMapContainer}}{{#isListContainer}}(Decode.list {{/isListContainer}}{{#vendorExtensions}}{{x-decoder}}{{/vendorExtensions}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/dataType}}{{/-first}}{{/responses}} , timeout = Just 30000 , withCredentials = False } diff --git a/samples/client/petstore/elm/licenseInfo.elm b/samples/client/petstore/elm/licenseInfo.elm deleted file mode 100644 index a8a80732814..00000000000 --- a/samples/client/petstore/elm/licenseInfo.elm +++ /dev/null @@ -1,11 +0,0 @@ -{- - * {{{appName}}} - * {{{appDescription}}} - * - * {{#version}}OpenAPI spec version: {{{version}}}{{/version}} - * {{#infoEmail}}Contact: {{{infoEmail}}}{{/infoEmail}} - * - * NOTE: This file is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit manually. - -} diff --git a/samples/client/petstore/elm/src/Byte.elm b/samples/client/petstore/elm/src/Byte.elm index 44413db12c4..6974f1ed59b 100644 --- a/samples/client/petstore/elm/src/Byte.elm +++ b/samples/client/petstore/elm/src/Byte.elm @@ -4,7 +4,8 @@ import Json.Decode as Decode exposing (Decoder) import Json.Encode as Encode -type alias Byte = String +type alias Byte = + String byteDecoder : Decoder Byte diff --git a/samples/client/petstore/elm/src/Data/Order.elm b/samples/client/petstore/elm/src/Data/Order_.elm similarity index 93% rename from samples/client/petstore/elm/src/Data/Order.elm rename to samples/client/petstore/elm/src/Data/Order_.elm index 6c18dabdb3f..d6e02d68942 100644 --- a/samples/client/petstore/elm/src/Data/Order.elm +++ b/samples/client/petstore/elm/src/Data/Order_.elm @@ -11,7 +11,7 @@ -} -module Data.Order exposing (Order, Status(..), orderDecoder, orderEncoder) +module Data.Order_ exposing (Order_, Status(..), orderDecoder, orderEncoder) import DateTime exposing (DateTime, dateTimeDecoder, dateTimeEncoder) import Json.Decode as Decode exposing (Decoder) @@ -25,7 +25,7 @@ import Maybe exposing (map, withDefault) -} -type alias Order = +type alias Order_ = { id : Maybe Int , petId : Maybe Int , quantity : Maybe Int @@ -42,9 +42,9 @@ type Status -orderDecoder : Decoder Order +orderDecoder : Decoder Order_ orderDecoder = - decode Order + decode Order_ |> optional "id" (Decode.nullable Decode.int) Nothing |> optional "petId" (Decode.nullable Decode.int) Nothing |> optional "quantity" (Decode.nullable Decode.int) Nothing @@ -54,7 +54,7 @@ orderDecoder = -orderEncoder : Order -> Encode.Value +orderEncoder : Order_ -> Encode.Value orderEncoder model = Encode.object [ ( "id", withDefault Encode.null (map Encode.int model.id) ) diff --git a/samples/client/petstore/elm/src/Request/Pet.elm b/samples/client/petstore/elm/src/Request/Pet.elm index 7adbd3f7484..9d4303057f0 100644 --- a/samples/client/petstore/elm/src/Request/Pet.elm +++ b/samples/client/petstore/elm/src/Request/Pet.elm @@ -15,6 +15,7 @@ module Request.Pet exposing (addPet, deletePet, findPetsByStatus, findPetsByTags import Data.Pet exposing (Pet, petDecoder, petEncoder) import Data.ApiResponse exposing (ApiResponse, apiResponseDecoder) +import Dict import Http import Json.Decode as Decode diff --git a/samples/client/petstore/elm/src/Request/Store.elm b/samples/client/petstore/elm/src/Request/Store.elm index 2042455799d..f6048f45f88 100644 --- a/samples/client/petstore/elm/src/Request/Store.elm +++ b/samples/client/petstore/elm/src/Request/Store.elm @@ -13,8 +13,8 @@ module Request.Store exposing (deleteOrder, getInventory, getOrderById, placeOrder) -import Data.Order exposing (Order, orderDecoder, orderEncoder) -import Data.Int exposing (Int, intDecoder) +import Data.Order_ exposing (Order_, orderDecoder, orderEncoder) +import Dict import Http import Json.Decode as Decode @@ -43,13 +43,13 @@ deleteOrder orderId = {- Returns a map of status codes to quantities -} -getInventory : Http.Request Int +getInventory : Http.Request (Dict.Dict String Int) getInventory = { method = "GET" , url = basePath ++ "/store/inventory" , headers = [] , body = Http.emptyBody - , expect = Http.expectJson intDecoder + , expect = Http.expectJson (Decode.dict Decode.int) , timeout = Just 30000 , withCredentials = False } @@ -59,7 +59,7 @@ getInventory = {- For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions -} -getOrderById : Int -> Http.Request Order +getOrderById : Int -> Http.Request Order_ getOrderById orderId = { method = "GET" , url = basePath ++ "/store/order/" ++ toString orderId @@ -75,7 +75,7 @@ getOrderById orderId = {- -} -placeOrder : Order -> Http.Request Order +placeOrder : Order_ -> Http.Request Order_ placeOrder model = { method = "POST" , url = basePath ++ "/store/order" diff --git a/samples/client/petstore/elm/src/Request/User.elm b/samples/client/petstore/elm/src/Request/User.elm index 17a1ee1ea1e..e35df86fadb 100644 --- a/samples/client/petstore/elm/src/Request/User.elm +++ b/samples/client/petstore/elm/src/Request/User.elm @@ -14,7 +14,7 @@ module Request.User exposing (createUser, createUsersWithArrayInput, createUsersWithListInput, deleteUser, getUserByName, loginUser, logoutUser, updateUser) import Data.User exposing (User, userDecoder, userEncoder) -import Data.String exposing (Decode.string, String) +import Dict import Http import Json.Decode as Decode