From a1087f4405a83bfc52832ebb347d346ce1c896ad Mon Sep 17 00:00:00 2001
From: Erik Timmers <e.timmers@gmail.com>
Date: Mon, 20 Jan 2020 10:17:32 +0100
Subject: [PATCH 1/2] [elm] Fix generating arrays of enums

---
 .../src/main/resources/elm/fieldDecoder.mustache         | 2 +-
 .../src/main/resources/elm/fieldEncoder.mustache         | 2 +-
 .../openapi-generator/src/test/resources/3_0/elm.yaml    | 9 ++++++++-
 samples/openapi3/client/elm/src/Api/Data.elm             | 6 ++++++
 4 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/modules/openapi-generator/src/main/resources/elm/fieldDecoder.mustache b/modules/openapi-generator/src/main/resources/elm/fieldDecoder.mustache
index 08364e454a3..20132a3c7ca 100644
--- a/modules/openapi-generator/src/main/resources/elm/fieldDecoder.mustache
+++ b/modules/openapi-generator/src/main/resources/elm/fieldDecoder.mustache
@@ -1 +1 @@
-{{#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}}{{#isModel}}{{#isDefault}}Api.Data.{{/isDefault}}{{#lambda.camelcase}}{{#isEnum}}{{classname}}{{enumName}}{{/isEnum}}{{^isEnum}}{{dataType}}{{/isEnum}}{{/lambda.camelcase}}Decoder{{/isModel}}
\ No newline at end of file
+{{#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
diff --git a/modules/openapi-generator/src/main/resources/elm/fieldEncoder.mustache b/modules/openapi-generator/src/main/resources/elm/fieldEncoder.mustache
index 2644d33c3ad..bb3db523688 100644
--- a/modules/openapi-generator/src/main/resources/elm/fieldEncoder.mustache
+++ b/modules/openapi-generator/src/main/resources/elm/fieldEncoder.mustache
@@ -1 +1 @@
-{{#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}}{{#isModel}}{{#lambda.camelcase}}encode{{#isEnum}}{{classname}}{{enumName}}{{/isEnum}}{{^isEnum}}{{dataType}}{{/isEnum}}{{/lambda.camelcase}}{{/isModel}}
\ No newline at end of file
+{{#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
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 1ad2fe2c92a..add5576b407 100644
--- a/modules/openapi-generator/src/test/resources/3_0/elm.yaml
+++ b/modules/openapi-generator/src/test/resources/3_0/elm.yaml
@@ -131,6 +131,14 @@ components:
             type: array
             items:
               type: string
+        arrayOfPrimitve:
+          type: array
+          items:
+            $ref: "#/components/schemas/Primitive"
+        arrayOfEnum:
+          type: array
+          items:
+            $ref: "#/components/schemas/Enum"
     Composed:
       description: Composed model
       allOf:
@@ -254,4 +262,3 @@ components:
           type: string
         in_the_middle:
           type: string
-
diff --git a/samples/openapi3/client/elm/src/Api/Data.elm b/samples/openapi3/client/elm/src/Api/Data.elm
index d3f0996776b..262d799513e 100644
--- a/samples/openapi3/client/elm/src/Api/Data.elm
+++ b/samples/openapi3/client/elm/src/Api/Data.elm
@@ -91,6 +91,8 @@ type alias Absent =
 type alias Array =
     { array : List (String)
     , arrayOfArray : List (List (String))
+    , arrayOfPrimitve : Maybe (List (Primitive))
+    , arrayOfEnum : Maybe (List (Enum))
     }
 
 
@@ -293,6 +295,8 @@ encodeArrayPairs model =
         pairs =
             [ encode "array" (Json.Encode.list Json.Encode.string) model.array
             , encode "arrayOfArray" (Json.Encode.list (Json.Encode.list Json.Encode.string)) model.arrayOfArray
+            , maybeEncode "arrayOfPrimitve" (Json.Encode.list encodePrimitive) model.arrayOfPrimitve
+            , maybeEncode "arrayOfEnum" (Json.Encode.list encodeEnum) model.arrayOfEnum
             ]
     in
     pairs
@@ -640,6 +644,8 @@ arrayDecoder =
     Json.Decode.succeed Array
         |> decode "array" (Json.Decode.list Json.Decode.string) 
         |> decode "arrayOfArray" (Json.Decode.list (Json.Decode.list Json.Decode.string)) 
+        |> maybeDecode "arrayOfPrimitve" (Json.Decode.list primitiveDecoder) Nothing
+        |> maybeDecode "arrayOfEnum" (Json.Decode.list enumDecoder) Nothing
 
 
 composedDecoder : Json.Decode.Decoder Composed
-- 
GitLab


From 51f0182a8a8026661c20d15c34d7411d196c0123 Mon Sep 17 00:00:00 2001
From: Erik Timmers <e.timmers@gmail.com>
Date: Mon, 20 Jan 2020 10:27:36 +0100
Subject: [PATCH 2/2] [elm] Add suffix to operation parameters

So there are no longer conflicts between parameters or
parameters and operation names.
---
 .../src/main/resources/elm/operation.mustache        | 10 +++++-----
 .../src/main/resources/elm/paramName.mustache        |  1 +
 .../openapi3/client/elm/src/Api/Request/Default.elm  | 12 ++++++------
 .../client/elm/src/Api/Request/Primitive.elm         |  4 ++--
 4 files changed, 14 insertions(+), 13 deletions(-)
 create mode 100644 modules/openapi-generator/src/main/resources/elm/paramName.mustache

diff --git a/modules/openapi-generator/src/main/resources/elm/operation.mustache b/modules/openapi-generator/src/main/resources/elm/operation.mustache
index 2c8b071c0ef..3bc12acf233 100644
--- a/modules/openapi-generator/src/main/resources/elm/operation.mustache
+++ b/modules/openapi-generator/src/main/resources/elm/operation.mustache
@@ -34,13 +34,13 @@ import Uuid exposing (Uuid){{/includeUuid}}
 -}
 {{/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}} {{paramName}}{{/allParams}} =
+{{operationId}}{{#allParams}} {{>paramName}}{{/allParams}} =
     Api.request
         "{{httpMethod}}"
         "{{path}}"
-        [{{#pathParams}} ( "{{paramName}}", {{>paramToString}} {{paramName}} ){{#-last}} {{/-last}}{{^-last}},{{/-last}}{{/pathParams}}]
-        [{{#queryParams}} ( "{{baseName}}", {{#required}}Just <| {{/required}}{{^required}}Maybe.map {{/required}}{{>paramToString}} {{paramName}} ){{#-last}} {{/-last}}{{^-last}},{{/-last}}{{/queryParams}}]
-        [{{#headerParams}} ( "{{baseName}}", {{#required}}Just <| {{/required}}{{^required}}Maybe.map {{/required}}{{>paramToString}} {{paramName}} ){{#-last}} {{/-last}}{{^-last}},{{/-last}}{{/headerParams}}]
-        {{#bodyParam}}({{#required}}Just ({{/required}}{{^required}}Maybe.map {{/required}}{{#isModel}}Api.Data.{{/isModel}}{{>recordFieldValueEncoder}} {{paramName}}{{#required}}){{/required}}){{/bodyParam}}{{^bodyParam}}Nothing{{/bodyParam}}
+        [{{#pathParams}} ( "{{paramName}}", {{>paramToString}} {{>paramName}} ){{#-last}} {{/-last}}{{^-last}},{{/-last}}{{/pathParams}}]
+        [{{#queryParams}} ( "{{baseName}}", {{#required}}Just <| {{/required}}{{^required}}Maybe.map {{/required}}{{>paramToString}} {{>paramName}} ){{#-last}} {{/-last}}{{^-last}},{{/-last}}{{/queryParams}}]
+        [{{#headerParams}} ( "{{baseName}}", {{#required}}Just <| {{/required}}{{^required}}Maybe.map {{/required}}{{>paramToString}} {{>paramName}} ){{#-last}} {{/-last}}{{^-last}},{{/-last}}{{/headerParams}}]
+        {{#bodyParam}}({{#required}}Just ({{/required}}{{^required}}Maybe.map {{/required}}{{#isModel}}Api.Data.{{/isModel}}{{>recordFieldValueEncoder}} {{>paramName}}{{#required}}){{/required}}){{/bodyParam}}{{^bodyParam}}Nothing{{/bodyParam}}
         {{^responses}}(Json.Decode.succeed ()){{/responses}}{{#responses}}{{#isDefault}}{{^dataType}}(Json.Decode.succeed ()){{/dataType}}{{#dataType}}{{>recordFieldValueDecoder}}{{/dataType}}{{/isDefault}}{{/responses}}
 {{/operation}}{{/operations}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/elm/paramName.mustache b/modules/openapi-generator/src/main/resources/elm/paramName.mustache
new file mode 100644
index 00000000000..52c3426a586
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/elm/paramName.mustache
@@ -0,0 +1 @@
+{{paramName}}{{#isPathParam}}_path{{/isPathParam}}{{#isQueryParam}}_query{{/isQueryParam}}{{#isHeaderParam}}_header{{/isHeaderParam}}{{#isBodyParam}}_body{{/isBodyParam}}
\ No newline at end of file
diff --git a/samples/openapi3/client/elm/src/Api/Request/Default.elm b/samples/openapi3/client/elm/src/Api/Request/Default.elm
index 75f381aa201..89b5e57b681 100644
--- a/samples/openapi3/client/elm/src/Api/Request/Default.elm
+++ b/samples/openapi3/client/elm/src/Api/Request/Default.elm
@@ -109,13 +109,13 @@ stringFromEnum model =
 
 
 headerPost : String -> Maybe Int -> Maybe HeaderType -> Api.Request String
-headerPost string integer headerType =
+headerPost string_header integer_header headerType_header =
     Api.request
         "POST"
         "/header"
         []
         []
-        [ ( "string", Just <| identity string ), ( "integer", Maybe.map String.fromInt integer ), ( "headerType", Maybe.map stringFromHeaderType headerType ) ]
+        [ ( "string", Just <| identity string_header ), ( "integer", Maybe.map String.fromInt integer_header ), ( "headerType", Maybe.map stringFromHeaderType headerType_header ) ]
         Nothing
         Json.Decode.string
 
@@ -135,11 +135,11 @@ maybeGet =
 
 
 pathStringIntegerEnumerationGet : String -> Int -> Enumeration -> Api.Request ()
-pathStringIntegerEnumerationGet string integer enumeration =
+pathStringIntegerEnumerationGet string_path integer_path enumeration_path =
     Api.request
         "GET"
         "/path/{string}/{integer}/{enumeration}"
-        [ ( "string", identity string ), ( "integer", String.fromInt integer ), ( "enumeration", stringFromEnumeration enumeration ) ]
+        [ ( "string", identity string_path ), ( "integer", String.fromInt integer_path ), ( "enumeration", stringFromEnumeration enumeration_path ) ]
         []
         []
         Nothing
@@ -148,12 +148,12 @@ pathStringIntegerEnumerationGet string integer enumeration =
 
 
 queryGet : Maybe String -> Maybe Int -> Maybe Enum -> Api.Request ()
-queryGet string int enum =
+queryGet string_query int_query enum_query =
     Api.request
         "GET"
         "/query"
         []
-        [ ( "string", Maybe.map identity string ), ( "int", Maybe.map String.fromInt int ), ( "enum", Maybe.map stringFromEnum enum ) ]
+        [ ( "string", Maybe.map identity string_query ), ( "int", Maybe.map String.fromInt int_query ), ( "enum", Maybe.map stringFromEnum enum_query ) ]
         []
         Nothing
         (Json.Decode.succeed ())
diff --git a/samples/openapi3/client/elm/src/Api/Request/Primitive.elm b/samples/openapi3/client/elm/src/Api/Request/Primitive.elm
index f9e59dce68d..05f36eea518 100644
--- a/samples/openapi3/client/elm/src/Api/Request/Primitive.elm
+++ b/samples/openapi3/client/elm/src/Api/Request/Primitive.elm
@@ -27,12 +27,12 @@ import Json.Encode
 
 
 update : Api.Data.Primitive -> Api.Request Api.Data.Primitive
-update primitive =
+update primitive_body =
     Api.request
         "POST"
         "/data"
         []
         []
         []
-        (Just (Api.Data.encodePrimitive primitive))
+        (Just (Api.Data.encodePrimitive primitive_body))
         Api.Data.primitiveDecoder
-- 
GitLab