Skip to content

Commit e3b5fcc

Browse files
committed
[elm] Add toString for all types
1 parent c8d5701 commit e3b5fcc

File tree

27 files changed

+227
-112
lines changed

27 files changed

+227
-112
lines changed

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

Lines changed: 22 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> o
434434
Map<String, Object> objs = (Map<String, Object>) operations.get("operations");
435435
List<CodegenOperation> ops = (List<CodegenOperation>) objs.get("operation");
436436

437-
final Map<String, Set<String>> dependencies = new HashMap<>();
437+
final Set<String> dependencies = new HashSet<>();
438438

439439
for (CodegenOperation op : ops) {
440440
if (ElmVersion.ELM_018.equals(elmVersion)) {
@@ -445,57 +445,38 @@ public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> o
445445
}
446446
op.path = ("\"" + path + "\"").replaceAll(" \\+\\+ \"\"", "");
447447
} else {
448-
final List<String> paths = Arrays.asList(op.path.substring(1).split("/"));
449-
String path = paths.stream()
450-
.map(str -> str.startsWith("{") && str.endsWith("}") ? str : "\"" + str + "\"")
451-
.collect(Collectors.joining(", "));
452-
for (CodegenParameter param : op.pathParams) {
453-
String str = paramToString("params", param, false, null);
454-
path = path.replace("{" + param.paramName + "}", str);
455-
}
456-
op.path = path;
457-
458-
final String query = op.queryParams.stream()
459-
.map(param -> paramToString("params", param, true, "Url.string \"" + param.baseName + "\""))
460-
.collect(Collectors.joining(", "));
461-
op.vendorExtensions.put("query", query);
462-
463-
final String headers = op.headerParams.stream()
464-
.map(param -> paramToString("headers", param, true, "Http.header \"" + param.baseName + "\""))
465-
.collect(Collectors.joining(", "));
466-
op.vendorExtensions.put("headers", headers);
467-
// TODO cookies
468-
// TODO forms
448+
final List<Object> pathParams = Arrays.asList(op.path.substring(1).split("/")).stream()
449+
.map(str -> {
450+
if (str.startsWith("{") && str.endsWith("}")) {
451+
return op.pathParams.stream().filter(p -> str.equals("{" + p.paramName + "}")).findFirst().orElse(null);
452+
} else {
453+
return "\"" + str + "\"";
454+
}
455+
})
456+
.collect(Collectors.toList());
457+
op.vendorExtensions.put("pathParams", pathParams);
469458
}
470459

471-
if (op.bodyParam != null && !op.bodyParam.isPrimitiveType && !op.bodyParam.isMapContainer) {
472-
final String encoder = (String) op.bodyParam.vendorExtensions.get(ENCODER);
473-
if (encoder != null) {
474-
if (!dependencies.containsKey(op.bodyParam.dataType)) {
475-
dependencies.put(op.bodyParam.dataType, new TreeSet<String>());
476-
}
460+
for (CodegenParameter param : op.allParams) {
461+
if (param.isPrimitiveType || param.isContainer || param.isDate || param.isDateTime || param.isUuid) {
462+
continue;
477463
}
464+
dependencies.add(param.dataType);
478465
}
479466
for (CodegenResponse resp : op.responses) {
480-
if (resp.primitiveType || resp.isMapContainer) {
467+
if (resp.primitiveType || resp.isMapContainer || resp.isDate || resp.isDateTime || resp.isUuid) {
481468
continue;
482469
}
483-
final String decoder = (String) resp.vendorExtensions.get(DECODER);
484-
if (decoder != null) {
485-
if (!dependencies.containsKey(resp.dataType)) {
486-
dependencies.put(resp.dataType, new TreeSet<String>());
487-
}
488-
}
470+
dependencies.add(resp.dataType);
489471
}
490472
}
491473

492474
final List<ElmImport> elmImports = new ArrayList<>();
493-
for (Map.Entry<String, Set<String>> entry : dependencies.entrySet()) {
475+
for (String key : dependencies) {
494476
final ElmImport elmImport = new ElmImport();
495-
final String key = entry.getKey();
496477
elmImport.moduleName = "Data." + key;
497478
elmImport.as = key;
498-
elmImport.exposures = entry.getValue();
479+
elmImport.exposures = new HashSet<>();
499480
elmImport.exposures.add(key);
500481
elmImport.hasExposures = true;
501482
elmImports.add(elmImport);
@@ -589,12 +570,14 @@ private Optional<String> paramToStringMapper(final String paramName, final Codeg
589570
return Optional.of("String.fromInt");
590571
} else if (property.isFloat || property.isDouble) {
591572
return Optional.of("String.fromFloat");
573+
} else {
574+
return Optional.of(property.dataType + ".toString");
592575
}
593-
throw new RuntimeException("Parameter '" + paramName + "' cannot be converted to a string. Please report the issue.");
594576
}
595577

596578
private CodegenProperty paramToProperty(final CodegenParameter parameter) {
597579
final CodegenProperty property = new CodegenProperty();
580+
property.dataType = parameter.dataType;
598581
property.isEnum = parameter.isEnum;
599582
property.isString = parameter.isString;
600583
property.isBinary = parameter.isBinary;

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ type {{enumName}}
1616
{{#allowableValues.enumVars}} {{#-first}}= {{/-first}}{{^-first}}| {{/-first}}{{name}}
1717
{{/allowableValues.enumVars}}
1818

19-
{{paramName}}ToString : {{enumName}} -> String
20-
{{paramName}}ToString value =
19+
stringify{{enumName}} : {{enumName}} -> String
20+
stringify{{enumName}} value =
2121
case value of
2222
{{#allowableValues.enumVars}} {{name}} ->
2323
{{{value}}}
@@ -59,10 +59,10 @@ basePath =
5959
{{operationId}} {{#headerParams.0}}headers {{/headerParams.0}}params =
6060
Http.request
6161
{ method = "{{httpMethod}}"
62-
, headers = {{#headerParams.0}}List.filterMap identity {{/headerParams.0}}[{{{vendorExtensions.headers}}}]
62+
, headers = List.filterMap identity [{{#headerParams}}{{#required}}(Just << {{/required}}{{^required}}Maybe.map ({{/required}}Http.header "{{baseName}}" << {{>toString}}) {{^isElm018}}headers.{{/isElm018}}{{paramName}}{{^-last}}, {{/-last}}{{/headerParams}}]
6363
, url = Url.crossOrigin {{#enableCustomBasePaths}}params.{{/enableCustomBasePaths}}basePath
64-
[{{{path}}}]
65-
{{#queryParams.0}}(List.filterMap identity {{/queryParams.0}}[{{{vendorExtensions.query}}}]{{#queryParams.0}}){{/queryParams.0}}
64+
[{{#vendorExtensions.pathParams}}{{#paramName}}{{>toString}} params.{{paramName}}{{/paramName}}{{^paramName}}{{{.}}}{{/paramName}}{{^-last}}, {{/-last}}{{/vendorExtensions.pathParams}}]
65+
(List.filterMap identity [{{#queryParams}}{{#required}}(Just << {{/required}}{{^required}}Maybe.map ({{/required}}Url.string "{{baseName}}" << {{>toString}}) {{^isElm018}}params.{{/isElm018}}{{paramName}}{{^-last}}, {{/-last}}{{/queryParams}}])
6666
, 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}}
6767
, 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}}
6868
, timeout = Just 30000

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{{>licenseInfo}}
22

3-
module Data.{{classname}} exposing ({{#models}}{{#model}}{{classname}}{{#hasChildren}}(..){{/hasChildren}}{{#isEnum}}(..){{/isEnum}}{{^isEnum}}{{#vars}}{{#isEnum}}, {{vendorExtensions.elmCustomType}}(..){{/isEnum}}{{/vars}}{{/isEnum}}, decoder, encode{{/model}}{{/models}})
3+
module Data.{{classname}} exposing ({{#models}}{{#model}}{{classname}}{{#hasChildren}}(..){{/hasChildren}}{{#isEnum}}(..){{/isEnum}}{{^isEnum}}{{#vars}}{{#isEnum}}, {{vendorExtensions.elmCustomType}}(..){{/isEnum}}{{/vars}}{{/isEnum}}, decoder, encode, toString{{/model}}{{/models}})
44

55
{{>imports}}import Dict exposing (Dict)
66
import Json.Decode as Decode exposing (Decoder)
@@ -15,5 +15,6 @@ import Json.Encode as Encode
1515
-}
1616
{{/description}}
1717
{{#isEnum}}{{>modelTypeCustom}}{{/isEnum}}{{^isEnum}}{{#discriminator}}{{>modelTypeDiscriminator}}{{/discriminator}}{{^discriminator}}{{#isAlias}}{{>modelTypePrimitive}}{{/isAlias}}{{^isAlias}}{{#isArrayModel}}{{>modelTypeArray}}{{/isArrayModel}}{{^isArrayModel}}{{>modelTypeRecord}}{{/isArrayModel}}{{/isAlias}}{{/discriminator}}{{/isEnum}}
18+
1819
{{/model}}
1920
{{/models}}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,8 @@ decoder =
1010
encode : {{classname}} -> Encode.Value
1111
encode items =
1212
Encode.list {{#isElm018}}(List.map {{/isElm018}}{{vendorExtensions.elmEncoder}} items{{#isElm018}}){{/isElm018}}
13+
14+
15+
toString : {{classname}} -> String
16+
toString =
17+
Encode.encode 0 << encode

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,16 @@
44
{{>customTypeDecoder}}
55

66

7-
{{>customTypeEncoder}}
7+
{{>customTypeEncoder}}
8+
9+
10+
toString : {{classname}} -> String
11+
toString model =
12+
case model of
13+
{{#allowableValues}}
14+
{{#enumVars}}
15+
{{name}} ->
16+
{{{value}}}
17+
18+
{{/enumVars}}
19+
{{/allowableValues}}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,8 @@ encode model =
3030
{{modelName}}.encode "{{mappingName}}" subModel
3131

3232
{{/mappedModels}}
33+
34+
35+
toString : {{classname}} -> String
36+
toString =
37+
Encode.encode 0 << encode

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,8 @@ decoder =
1010
encode : {{classname}} -> Encode.Value
1111
encode =
1212
{{vendorExtensions.elmEncoder}}
13+
14+
15+
toString : {{classname}} -> String
16+
toString =
17+
{{>toString}}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ type alias {{classname}} =
1414

1515

1616
{{>recordEncoder}}
17+
18+
19+
toString : {{classname}} -> String
20+
toString =
21+
Encode.encode 0 << encode{{#vendorExtensions.discriminatorName}} ""{{/vendorExtensions.discriminatorName}}
22+
23+
1724
{{#vars}}
1825
{{#isEnum}}
1926

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{#isListContainer}}String.join "," << List.map {{#items}}{{>toString}}{{/items}}{{/isListContainer}}{{^isListContainer}}{{^isEnum}}{{#isString}}identity{{/isString}}{{#isBinary}}identity{{/isBinary}}{{#isByteArray}}identity{{/isByteArray}}{{/isEnum}}{{#isBoolean}}(\val -> if val then "true" else "false"){{/isBoolean}}{{#isDateTime}}DateTime.toString{{/isDateTime}}{{#isDate}}DateOnly.toString{{/isDate}}{{#isElm018}}toString{{/isElm018}}{{^isElm018}}{{#isInteger}}String.fromInt{{/isInteger}}{{#isLong}}String.fromInt{{/isLong}}{{#isFloat}}String.fromFloat{{/isFloat}}{{#isDouble}}String.fromFloat{{/isDouble}}{{#isEnum}}stringify{{enumName}}{{/isEnum}}{{^isEnum}}{{^isString}}{{^isBinary}}{{^isByteArray}}{{^isBoolean}}{{^isDouble}}{{^isFloat}}{{^isLong}}{{^isInteger}}{{dataType}}.toString{{/isInteger}}{{/isLong}}{{/isFloat}}{{/isDouble}}{{/isBoolean}}{{/isByteArray}}{{/isBinary}}{{/isString}}{{/isEnum}}{{/isElm018}}{{/isListContainer}}

modules/openapi-generator/src/test/java/org/openapitools/codegen/elm/ElmClientCodegenTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public void testPostProcessRootEndpoint() {
6565
assertTrue(result.containsKey("operations"));
6666
assertTrue(result.containsKey("elmImports"));
6767

68-
assertEquals(rootOp.path, "\"\"");
68+
assertEquals(rootOp.path, "/");
6969
}
7070

7171
@Test
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4.0.3-SNAPSHOT
1+
4.1.3-SNAPSHOT

samples/client/petstore/elm-0.18/src/Data/ApiResponse.elm

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
-}
1111

1212

13-
module Data.ApiResponse exposing (ApiResponse, decoder, encode)
13+
module Data.ApiResponse exposing (ApiResponse, decoder, encode, toString)
1414

1515
import Dict exposing (Dict)
1616
import Json.Decode as Decode exposing (Decoder)
@@ -46,3 +46,11 @@ encode model =
4646
]
4747

4848

49+
50+
toString : ApiResponse -> String
51+
toString =
52+
Encode.encode 0 << encode
53+
54+
55+
56+

samples/client/petstore/elm-0.18/src/Data/Category.elm

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
-}
1111

1212

13-
module Data.Category exposing (Category, decoder, encode)
13+
module Data.Category exposing (Category, decoder, encode, toString)
1414

1515
import Dict exposing (Dict)
1616
import Json.Decode as Decode exposing (Decoder)
@@ -43,3 +43,11 @@ encode model =
4343
]
4444

4545

46+
47+
toString : Category -> String
48+
toString =
49+
Encode.encode 0 << encode
50+
51+
52+
53+

samples/client/petstore/elm-0.18/src/Data/Order_.elm

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
-}
1111

1212

13-
module Data.Order_ exposing (Order_, Status(..), decoder, encode)
13+
module Data.Order_ exposing (Order_, Status(..), decoder, encode, toString)
1414

1515
import DateTime exposing (DateTime)
1616
import Dict exposing (Dict)
@@ -64,6 +64,13 @@ encode model =
6464

6565

6666

67+
toString : Order_ -> String
68+
toString =
69+
Encode.encode 0 << encode
70+
71+
72+
73+
6774
statusDecoder : Decoder Status
6875
statusDecoder =
6976
Decode.string
@@ -99,3 +106,4 @@ encodeStatus model =
99106

100107

101108

109+

samples/client/petstore/elm-0.18/src/Data/Pet.elm

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
-}
1111

1212

13-
module Data.Pet exposing (Pet, Status(..), decoder, encode)
13+
module Data.Pet exposing (Pet, Status(..), decoder, encode, toString)
1414

1515
import Data.Category as Category exposing (Category)
1616
import Data.Tag as Tag exposing (Tag)
@@ -65,6 +65,13 @@ encode model =
6565

6666

6767

68+
toString : Pet -> String
69+
toString =
70+
Encode.encode 0 << encode
71+
72+
73+
74+
6875
statusDecoder : Decoder Status
6976
statusDecoder =
7077
Decode.string
@@ -100,3 +107,4 @@ encodeStatus model =
100107

101108

102109

110+

samples/client/petstore/elm-0.18/src/Data/Tag.elm

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
-}
1111

1212

13-
module Data.Tag exposing (Tag, decoder, encode)
13+
module Data.Tag exposing (Tag, decoder, encode, toString)
1414

1515
import Dict exposing (Dict)
1616
import Json.Decode as Decode exposing (Decoder)
@@ -43,3 +43,11 @@ encode model =
4343
]
4444

4545

46+
47+
toString : Tag -> String
48+
toString =
49+
Encode.encode 0 << encode
50+
51+
52+
53+

samples/client/petstore/elm-0.18/src/Data/User.elm

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
-}
1111

1212

13-
module Data.User exposing (User, decoder, encode)
13+
module Data.User exposing (User, decoder, encode, toString)
1414

1515
import Dict exposing (Dict)
1616
import Json.Decode as Decode exposing (Decoder)
@@ -61,3 +61,11 @@ encode model =
6161
]
6262

6363

64+
65+
toString : User -> String
66+
toString =
67+
Encode.encode 0 << encode
68+
69+
70+
71+
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4.0.3-SNAPSHOT
1+
4.1.3-SNAPSHOT

samples/client/petstore/elm/src/Data/ApiResponse.elm

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
-}
1111

1212

13-
module Data.ApiResponse exposing (ApiResponse, decoder, encode)
13+
module Data.ApiResponse exposing (ApiResponse, decoder, encode, toString)
1414

1515
import Dict exposing (Dict)
1616
import Json.Decode as Decode exposing (Decoder)
@@ -46,3 +46,11 @@ encode model =
4646
]
4747

4848

49+
50+
toString : ApiResponse -> String
51+
toString =
52+
Encode.encode 0 << encode
53+
54+
55+
56+

0 commit comments

Comments
 (0)