Skip to content

Commit 38b1fe2

Browse files
eriktimwing328
authored andcommitted
Add support for enums in Elm operations (#2982)
1 parent d748312 commit 38b1fe2

File tree

3 files changed

+91
-37
lines changed

3 files changed

+91
-37
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -567,44 +567,56 @@ private String toOptionalValue(String value) {
567567
return "(Just " + value + ")";
568568
}
569569

570+
private Optional<String> paramToStringMapper(final String paramName, final CodegenProperty property) {
571+
if (property.isEnum) {
572+
return Optional.of(toVarName(paramName) + "ToString");
573+
} else if (property.isString || property.isBinary || property.isByteArray) {
574+
return Optional.empty();
575+
} else if (property.isBoolean) {
576+
return Optional.of("(\\val -> if val then \"true\" else \"false\")");
577+
} else if (property.isDateTime) {
578+
return Optional.of("DateTime.toString");
579+
} else if (property.isDate) {
580+
return Optional.of("DateOnly.toString");
581+
} else if (property.isUuid) {
582+
return Optional.of("Uuid.toString");
583+
} else if (ElmVersion.ELM_018.equals(elmVersion)) {
584+
return Optional.of("toString");
585+
} else if (property.isInteger || property.isLong) {
586+
return Optional.of("String.fromInt");
587+
} else if (property.isFloat || property.isDouble) {
588+
return Optional.of("String.fromFloat");
589+
}
590+
throw new RuntimeException("Parameter '" + paramName + "' cannot be converted to a string. Please report the issue.");
591+
}
592+
593+
private CodegenProperty paramToProperty(final CodegenParameter parameter) {
594+
final CodegenProperty property = new CodegenProperty();
595+
property.isEnum = parameter.isEnum;
596+
property.isString = parameter.isString;
597+
property.isBinary = parameter.isBinary;
598+
property.isByteArray = parameter.isByteArray;
599+
property.isBoolean = parameter.isBoolean;
600+
property.isDateTime = parameter.isDateTime;
601+
property.isDate = parameter.isDate;
602+
property.isUuid = parameter.isUuid;
603+
property.isInteger = parameter.isInteger;
604+
property.isLong = parameter.isLong;
605+
property.isFloat = parameter.isFloat;
606+
property.isDouble = parameter.isDouble;
607+
return property;
608+
}
609+
570610
private String paramToString(final String prefix, final CodegenParameter param, final boolean useMaybe, final String maybeMapResult) {
571611
final String paramName = (ElmVersion.ELM_018.equals(elmVersion) ? "" : prefix + ".") + param.paramName;
572612
if (!useMaybe) {
573613
param.required = true;
574614
}
575615

576-
String mapFn = null;
577-
if (param.isString || param.isBinary || param.isByteArray) {
578-
mapFn = "";
579-
} else if (param.isBoolean) {
580-
mapFn = "(\\val -> if val then \"true\" else \"false\")";
581-
} else if (param.isDateTime) {
582-
mapFn = "DateTime.toString";
583-
} else if (param.isDate) {
584-
mapFn = "DateOnly.toString";
585-
} else if (param.isUuid) {
586-
mapFn = "Uuid.toString";
587-
} else if (ElmVersion.ELM_018.equals(elmVersion)) {
588-
mapFn = "toString";
589-
} else if (param.isInteger || param.isLong) {
590-
mapFn = "String.fromInt";
591-
} else if (param.isFloat || param.isDouble) {
592-
mapFn = "String.fromFloat";
593-
} else if (param.isListContainer) {
594-
// TODO duplicate ALL types from parameter to property...
595-
if (param.items.isString || param.items.isUuid || param.items.isBinary || param.items.isByteArray) {
596-
mapFn = "String.join \",\"";
597-
}
598-
}
599-
if (mapFn == null) {
600-
throw new RuntimeException("Parameter '" + param.paramName + "' cannot be converted to a string. Please report the issue.");
601-
}
616+
final String mapFn = param.isListContainer
617+
? "(String.join \",\"" + paramToStringMapper(param.paramName, param.items).map(mapper -> " << List.map " + mapper).orElse("") + ")"
618+
: paramToStringMapper(param.paramName, paramToProperty(param)).orElse("");
602619

603-
if (param.isListContainer) {
604-
if (!param.required) {
605-
mapFn = "(" + mapFn + ")";
606-
}
607-
}
608620
String mapResult = "";
609621
if (maybeMapResult != null) {
610622
if ("".equals(mapFn)) {

modules/openapi-generator/src/main/resources/elm/api.mustache

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,36 @@
11
{{>licenseInfo}}
22

3-
module Request.{{classname}} exposing ({{#operations}}{{#operation}}{{^-first}}, {{/-first}}{{operationId}}{{/operation}}{{/operations}})
3+
module Request.{{classname}} exposing ({{#operations}}{{#operation}}{{^-first}}, {{/-first}}{{operationId}}{{#allParams}}{{#isEnum}}, {{enumName}}(..){{/isEnum}}{{/allParams}}{{/operation}}{{/operations}})
44

55
{{>imports}}import Dict
66
import Http
77
import Json.Decode as Decode
88
import Url.Builder as Url
99

1010

11+
{{#operations}}
12+
{{#operation}}
13+
{{#allParams}}
14+
{{#isEnum}}
15+
type {{enumName}}
16+
{{#allowableValues.enumVars}} {{#-first}}= {{/-first}}{{^-first}}| {{/-first}}{{name}}
17+
{{/allowableValues.enumVars}}
18+
19+
{{paramName}}ToString : {{enumName}} -> String
20+
{{paramName}}ToString value =
21+
case value of
22+
{{#allowableValues.enumVars}} {{name}} ->
23+
{{{value}}}
24+
25+
{{/allowableValues.enumVars}}
26+
27+
28+
{{/isEnum}}
29+
{{/allParams}}
30+
{{/operation}}
31+
{{/operations}}
32+
33+
1134
{{^enableCustomBasePaths}}basePath : String
1235
basePath =
1336
"{{basePath}}"
@@ -29,8 +52,8 @@ basePath =
2952
{{#enableCustomBasePaths}} , basePath : String{{/enableCustomBasePaths}}
3053
{{#enableHttpRequestTrackers}} , tracker : Maybe String{{/enableHttpRequestTrackers}}
3154
{{#bodyParam}} , body : {{^required}}Maybe {{/required}}{{dataType}}{{/bodyParam}}
32-
{{#pathParams}} , {{paramName}} : {{#isListContainer}}List {{/isListContainer}}{{dataType}}{{/pathParams}}
33-
{{#queryParams}} , {{paramName}} : {{^required}}Maybe ({{/required}}{{#isListContainer}}List {{/isListContainer}}{{dataType}}{{^required}}){{/required}}{{/queryParams}}
55+
{{#pathParams}} , {{paramName}} : {{#isListContainer}}List {{/isListContainer}}{{#datatypeWithEnum}}{{datatypeWithEnum}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{dataType}}{{/datatypeWithEnum}}{{/pathParams}}
56+
{{#queryParams}} , {{paramName}} : {{^required}}Maybe ({{/required}}{{#isListContainer}}List {{/isListContainer}}{{#datatypeWithEnum}}{{datatypeWithEnum}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{dataType}}{{/datatypeWithEnum}}{{^required}}){{/required}}{{/queryParams}}
3457
}
3558
-> Cmd msg
3659
{{operationId}} {{#headerParams.0}}headers {{/headerParams.0}}params =

samples/client/petstore/elm/src/Request/Pet.elm

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
-}
1111

1212

13-
module Request.Pet exposing (addPet, deletePet, findPetsByStatus, findPetsByTags, getPetById, updatePet, updatePetWithForm, uploadFile)
13+
module Request.Pet exposing (Status(..), addPet, deletePet, findPetsByStatus, findPetsByTags, getPetById, updatePet, updatePetWithForm, uploadFile)
1414

1515
import Data.ApiResponse as ApiResponse exposing (ApiResponse)
1616
import Data.Pet as Pet exposing (Pet)
@@ -20,6 +20,25 @@ import Json.Decode as Decode
2020
import Url.Builder as Url
2121

2222

23+
type Status
24+
= Available
25+
| Pending
26+
| Sold
27+
28+
29+
statusToString : Status -> String
30+
statusToString value =
31+
case value of
32+
Available ->
33+
"available"
34+
35+
Pending ->
36+
"pending"
37+
38+
Sold ->
39+
"sold"
40+
41+
2342
basePath : String
2443
basePath =
2544
"http://petstore.swagger.io/v2"
@@ -72,7 +91,7 @@ deletePet headers params =
7291
-}
7392
findPetsByStatus :
7493
{ onSend : Result Http.Error (List Pet) -> msg
75-
, status : List String
94+
, status : List Status
7695
}
7796
-> Cmd msg
7897
findPetsByStatus params =
@@ -82,7 +101,7 @@ findPetsByStatus params =
82101
, url =
83102
Url.crossOrigin basePath
84103
[ "pet", "findByStatus" ]
85-
(List.filterMap identity [ Just (Url.string "status" <| String.join "," params.status) ])
104+
(List.filterMap identity [ Just (Url.string "status" <| (String.join "," << List.map statusToString) params.status) ])
86105
, body = Http.emptyBody
87106
, expect = Http.expectJson params.onSend (Decode.list Pet.decoder)
88107
, timeout = Just 30000

0 commit comments

Comments
 (0)