Skip to content

Commit c19f985

Browse files
committed
Update Elm for elm/http 2.0.0
1 parent 65a86ee commit c19f985

File tree

10 files changed

+497
-265
lines changed

10 files changed

+497
-265
lines changed

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

Lines changed: 62 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ public ElmClientCodegen() {
8888
super();
8989
outputFolder = "generated-code/elm";
9090
modelTemplateFiles.put("model.mustache", ".elm");
91-
apiTemplateFiles.put("api.mustache", ".elm");
9291
templateDir = "elm";
9392

9493
supportsInheritance = true;
@@ -198,6 +197,7 @@ public void processOpts() {
198197
case ELM_018:
199198
LOGGER.info("Elm version: 0.18");
200199
additionalProperties.put("isElm018", true);
200+
apiTemplateFiles.put("api018.mustache", ".elm");
201201
supportingFiles.add(new SupportingFile("DateOnly018.mustache", "src", "DateOnly.elm"));
202202
supportingFiles.add(new SupportingFile("DateTime018.mustache", "src", "DateTime.elm"));
203203
supportingFiles.add(new SupportingFile("elm-package018.mustache", "", "elm-package.json"));
@@ -206,6 +206,7 @@ public void processOpts() {
206206
case ELM_019:
207207
LOGGER.info("Elm version: 0.19");
208208
additionalProperties.put("isElm019", true);
209+
apiTemplateFiles.put("api.mustache", ".elm");
209210
supportingFiles.add(new SupportingFile("DateOnly.mustache", "src", "DateOnly.elm"));
210211
supportingFiles.add(new SupportingFile("DateTime.mustache", "src", "DateTime.elm"));
211212
supportingFiles.add(new SupportingFile("elm.mustache", "", "elm.json"));
@@ -423,14 +424,33 @@ public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> o
423424
final Map<String, Set<String>> dependencies = new HashMap<>();
424425

425426
for (CodegenOperation op : ops) {
426-
String path = op.path;
427-
for (CodegenParameter param : op.pathParams) {
428-
final String var = paramToString(param);
429-
path = path.replace("{" + param.paramName + "}", "\" ++ " + var + " ++ \"");
430-
hasDateTime = hasDateTime || param.isDateTime;
431-
hasDate = hasDate || param.isDate;
427+
if (ElmVersion.ELM_018.equals(elmVersion)) {
428+
String path = op.path;
429+
for (CodegenParameter param : op.pathParams) {
430+
final String var = paramToString(param, false, null);
431+
path = path.replace("{" + param.paramName + "}", "\" ++ " + var + " ++ \"");
432+
hasDateTime = hasDateTime || param.isDateTime;
433+
hasDate = hasDate || param.isDate;
434+
}
435+
op.path = ("\"" + path + "\"").replaceAll(" \\+\\+ \"\"", "");
436+
} else {
437+
final List<String> paths = Arrays.asList(op.path.substring(1).split("/"));
438+
String path = paths.stream().map(str -> str.charAt(0) == '{' ? str : "\"" + str + "\"").collect(Collectors.joining(", "));
439+
for (CodegenParameter param : op.pathParams) {
440+
String str = paramToString(param, false, null);
441+
path = path.replace("{" + param.paramName + "}", str);
442+
hasDateTime = hasDateTime || param.isDateTime;
443+
hasDate = hasDate || param.isDate;
444+
}
445+
op.path = path;
446+
447+
final String query = op.queryParams.stream()
448+
.map(param -> paramToString(param, true, "Url.string \"" + param.paramName + "\""))
449+
.collect(Collectors.joining(", "));
450+
op.vendorExtensions.put("query", query);
451+
// TODO headers
452+
// TODO forms
432453
}
433-
op.path = ("\"" + path + "\"").replaceAll(" \\+\\+ \"\"", "");
434454

435455
if (op.bodyParam != null && !op.bodyParam.isPrimitiveType && !op.bodyParam.isMapContainer) {
436456
final String encoder = (String) op.bodyParam.vendorExtensions.get(ENCODER);
@@ -523,26 +543,49 @@ private String toOptionalValue(String value) {
523543
return "(Just " + value + ")";
524544
}
525545

526-
private String paramToString(final CodegenParameter param) {
527-
final String paramName = param.paramName;
546+
private String paramToString(final CodegenParameter param, final boolean useMaybe, final String maybeMapResult) {
547+
final String paramName = (ElmVersion.ELM_018.equals(elmVersion) ? "" : "params.") + param.paramName;
548+
if (!useMaybe) {
549+
param.required = true;
550+
}
528551

552+
String mapFn = null;
529553
if (param.isString || param.isUuid || param.isBinary || param.isByteArray) {
530-
return paramName;
554+
mapFn = "";
531555
} else if (param.isBoolean) {
532-
return "if " + paramName + " then \"true\" else \"false\"";
556+
mapFn = "(\\val -> if val then \"true\" else \"false\")";
533557
} else if (param.isDateTime) {
534-
return "DateTime.toString " + paramName;
558+
mapFn = "DateTime.toString";
535559
} else if (param.isDate) {
536-
return "DateOnly.toString " + paramName;
560+
mapFn = "DateOnly.toString";
537561
} else if (ElmVersion.ELM_018.equals(elmVersion)) {
538-
return "toString " + paramName;
562+
mapFn = "toString";
539563
} else if (param.isInteger || param.isLong) {
540-
return "String.fromInt " + paramName;
564+
mapFn = "String.fromInt";
541565
} else if (param.isFloat || param.isDouble) {
542-
return "String.fromFloat " + paramName;
566+
mapFn = "String.fromFloat";
567+
} else if (param.isListContainer) {
568+
// TODO duplicate ALL types from parameter to property...
569+
if (param.items.isString || param.items.isUuid || param.items.isBinary || param.items.isByteArray) {
570+
mapFn = "String.join \",\"";
571+
}
543572
}
544-
545-
throw new RuntimeException("Parameter '" + paramName + "' cannot be converted to a string. Please report the issue.");
573+
if (mapFn == null) {
574+
throw new RuntimeException("Parameter '" + param.paramName + "' cannot be converted to a string. Please report the issue.");
575+
}
576+
577+
if (param.isListContainer) {
578+
if (!param.required) {
579+
mapFn = "(" + mapFn + ")";
580+
}
581+
}
582+
String mapResult = "";
583+
if (maybeMapResult != null) {
584+
mapResult = maybeMapResult + (param.required ? " <|" : " <<");
585+
}
586+
final String just = useMaybe ? "Just (" : "";
587+
final String justEnd = useMaybe ? ")" : "";
588+
return (param.required ? just : "Maybe.map") + mapResult + " " + mapFn + " " + paramName + (param.required ? justEnd : "");
546589
}
547590

548591
@Override

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

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module Request.{{classname}} exposing ({{#operations}}{{#operation}}{{^-first}},
55
{{>imports}}import Dict
66
import Http
77
import Json.Decode as Decode
8+
import Url.Builder as Url
89

910

1011
basePath : String
@@ -18,16 +19,24 @@ basePath =
1819
{-| {{{notes}}}
1920
-}
2021
{{/notes}}
21-
{{operationId}} : {{#pathParams}}{{dataType}} -> {{/pathParams}}{{#bodyParam}}{{dataType}} -> {{/bodyParam}}Http.Request {{^responses}}(){{/responses}}{{#responses}}{{#-first}}{{^dataType}}(){{/dataType}}{{#isMapContainer}}(Dict.Dict String {{/isMapContainer}}{{#isListContainer}}(List {{/isListContainer}}{{dataType}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/-first}}{{/responses}}
22-
{{operationId}} {{#pathParams}}{{paramName}} {{/pathParams}}{{#bodyParam}}model {{/bodyParam}}=
23-
{ method = "{{httpMethod}}"
24-
, url = basePath ++ {{{path}}}
25-
, headers = []
26-
, body = {{#bodyParam}}Http.jsonBody <| {{vendorExtensions.elmEncoder}} model{{/bodyParam}}{{^bodyParam}}Http.emptyBody{{/bodyParam}}
27-
, expect = {{^responses}}Http.expectStringResponse (\_ -> Ok ()){{/responses}}{{#responses}}{{#-first}}{{^dataType}}Http.expectStringResponse (\_ -> Ok ()){{/dataType}}{{#dataType}}Http.expectJson {{#isMapContainer}}(Decode.dict {{/isMapContainer}}{{#isListContainer}}(Decode.list {{/isListContainer}}{{#vendorExtensions}}{{elmDecoder}}{{/vendorExtensions}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/dataType}}{{/-first}}{{/responses}}
28-
, timeout = Just 30000
29-
, withCredentials = False
22+
{{operationId}} :
23+
{ onSend : Result Http.Error {{^responses}}(){{/responses}}{{#responses}}{{#-first}}{{^dataType}}(){{/dataType}}{{#isMapContainer}}(Dict.Dict String {{/isMapContainer}}{{#isListContainer}}(List {{/isListContainer}}{{dataType}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/-first}}{{/responses}} -> msg
24+
{{#bodyParam}} , body : {{^required}}Maybe {{/required}}{{dataType}}{{/bodyParam}}
25+
{{#pathParams}} , {{paramName}} : {{#isListContainer}}List {{/isListContainer}}{{dataType}}{{/pathParams}}
26+
{{#queryParams}} , {{paramName}} : {{^required}}Maybe ({{/required}}{{#isListContainer}}List {{/isListContainer}}{{dataType}}{{^required}}){{/required}}{{/queryParams}}
3027
}
31-
|> Http.request
28+
-> Cmd msg
29+
{{operationId}} params =
30+
Http.request
31+
{ method = "{{httpMethod}}"
32+
, headers = []
33+
, url = Url.crossOrigin basePath
34+
[{{{path}}}]
35+
(List.filterMap identity [{{{vendorExtensions.query}}}])
36+
, body = {{#bodyParam}}{{^required}}Maybe.withDefault Http.emptyBody <| Maybe.map ({{/required}}Http.jsonBody {{#required}}<|{{/required}}{{^required}}<<{{/required}} {{vendorExtensions.elmEncoder}}{{^required}}){{/required}} params.body{{/bodyParam}}{{^bodyParam}}Http.emptyBody{{/bodyParam}}
37+
, expect = {{^responses}}Http.expectWhatever params.onSend{{/responses}}{{#responses}}{{#-first}}{{^dataType}}Http.expectWhatever params.onSend{{/dataType}}{{#dataType}}Http.expectJson params.onSend {{#isMapContainer}}(Decode.dict {{/isMapContainer}}{{#isListContainer}}(Decode.list {{/isListContainer}}{{#vendorExtensions}}{{elmDecoder}}{{/vendorExtensions}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/dataType}}{{/-first}}{{/responses}}
38+
, timeout = Just 30000
39+
, tracker = Nothing
40+
}
3241
{{/operation}}
3342
{{/operations}}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{{>licenseInfo}}
2+
3+
module Request.{{classname}} exposing ({{#operations}}{{#operation}}{{^-first}}, {{/-first}}{{operationId}}{{/operation}}{{/operations}})
4+
5+
{{>imports}}import Dict
6+
import Http
7+
import Json.Decode as Decode
8+
9+
10+
basePath : String
11+
basePath =
12+
"{{basePath}}"
13+
{{#operations}}
14+
{{#operation}}
15+
16+
17+
{{#notes}}
18+
{-| {{{notes}}}
19+
-}
20+
{{/notes}}
21+
{{operationId}} : {{#pathParams}}{{dataType}} -> {{/pathParams}}{{#bodyParam}}{{dataType}} -> {{/bodyParam}}Http.Request {{^responses}}(){{/responses}}{{#responses}}{{#-first}}{{^dataType}}(){{/dataType}}{{#isMapContainer}}(Dict.Dict String {{/isMapContainer}}{{#isListContainer}}(List {{/isListContainer}}{{dataType}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/-first}}{{/responses}}
22+
{{operationId}} {{#pathParams}}{{paramName}} {{/pathParams}}{{#bodyParam}}model {{/bodyParam}}=
23+
{ method = "{{httpMethod}}"
24+
, url = basePath ++ {{{path}}}
25+
, headers = []
26+
, body = {{#bodyParam}}Http.jsonBody <| {{vendorExtensions.elmEncoder}} model{{/bodyParam}}{{^bodyParam}}Http.emptyBody{{/bodyParam}}
27+
, expect = {{^responses}}Http.expectStringResponse (\_ -> Ok ()){{/responses}}{{#responses}}{{#-first}}{{^dataType}}Http.expectStringResponse (\_ -> Ok ()){{/dataType}}{{#dataType}}Http.expectJson {{#isMapContainer}}(Decode.dict {{/isMapContainer}}{{#isListContainer}}(Decode.list {{/isListContainer}}{{#vendorExtensions}}{{elmDecoder}}{{/vendorExtensions}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/dataType}}{{/-first}}{{/responses}}
28+
, timeout = Just 30000
29+
, withCredentials = False
30+
}
31+
|> Http.request
32+
{{/operation}}
33+
{{/operations}}

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,20 @@
77
"dependencies": {
88
"direct": {
99
"NoRedInk/elm-json-decode-pipeline": "1.0.0",
10-
"elm/browser": "1.0.0",
11-
"elm/core": "1.0.0",
10+
"elm/browser": "1.0.1",
11+
"elm/core": "1.0.2",
1212
"elm/html": "1.0.0",
13-
"elm/http": "1.0.0",
14-
"elm/json": "1.0.0",
13+
"elm/http": "2.0.0",
14+
"elm/json": "1.1.2",
1515
"elm/time": "1.0.0",
16-
"rtfeldman/elm-iso8601-date-strings": "1.0.0"
16+
"elm/url": "1.0.0",
17+
"rtfeldman/elm-iso8601-date-strings": "1.1.2"
1718
},
1819
"indirect": {
19-
"elm/parser": "1.0.0",
20-
"elm/url": "1.0.0",
21-
"elm/virtual-dom": "1.0.0"
20+
"elm/bytes": "1.0.5",
21+
"elm/file": "1.0.1",
22+
"elm/parser": "1.1.0",
23+
"elm/virtual-dom": "1.0.2"
2224
}
2325
},
2426
"test-dependencies": {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.3.2-SNAPSHOT
1+
4.0.0-SNAPSHOT
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.3.2-SNAPSHOT
1+
4.0.0-SNAPSHOT

samples/client/petstore/elm/elm.json

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,20 @@
77
"dependencies": {
88
"direct": {
99
"NoRedInk/elm-json-decode-pipeline": "1.0.0",
10-
"elm/browser": "1.0.0",
11-
"elm/core": "1.0.0",
10+
"elm/browser": "1.0.1",
11+
"elm/core": "1.0.2",
1212
"elm/html": "1.0.0",
13-
"elm/http": "1.0.0",
14-
"elm/json": "1.0.0",
13+
"elm/http": "2.0.0",
14+
"elm/json": "1.1.2",
1515
"elm/time": "1.0.0",
16-
"rtfeldman/elm-iso8601-date-strings": "1.0.0"
16+
"elm/url": "1.0.0",
17+
"rtfeldman/elm-iso8601-date-strings": "1.1.2"
1718
},
1819
"indirect": {
19-
"elm/parser": "1.0.0",
20-
"elm/url": "1.0.0",
21-
"elm/virtual-dom": "1.0.0"
20+
"elm/bytes": "1.0.5",
21+
"elm/file": "1.0.1",
22+
"elm/parser": "1.1.0",
23+
"elm/virtual-dom": "1.0.2"
2224
}
2325
},
2426
"test-dependencies": {

0 commit comments

Comments
 (0)