Skip to content

Commit 5e0bdd6

Browse files
committed
improve integration with ecto
1 parent e00420c commit 5e0bdd6

5 files changed

Lines changed: 38 additions & 23 deletions

File tree

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

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,24 @@ public CodegenModel fromModel(String name, Schema model) {
408408
for (CodegenProperty var : optionalVars) {
409409
ecm.optionalVars.add(new ExtendedCodegenProperty(var));
410410
}
411+
412+
List<CodegenProperty> ectoFields = new ArrayList<>(ecm.ectoFields);
413+
ecm.ectoFields.clear();
414+
for (CodegenProperty field : ectoFields) {
415+
ecm.ectoFields.add(new ExtendedCodegenProperty(field));
416+
}
417+
418+
List<CodegenProperty> ectoEmbeds = new ArrayList<>(ecm.ectoEmbeds);
419+
ecm.ectoEmbeds.clear();
420+
for (CodegenProperty embed : ectoEmbeds) {
421+
ecm.ectoEmbeds.add(new ExtendedCodegenProperty(embed));
422+
}
423+
424+
List<CodegenProperty> requiredEctoFields = new ArrayList<>(ecm.requiredEctoFields);
425+
ecm.requiredEctoFields.clear();
426+
for (CodegenProperty field : requiredEctoFields) {
427+
ecm.requiredEctoFields.add(new ExtendedCodegenProperty(field));
428+
}
411429

412430
return ecm;
413431
}
@@ -890,9 +908,9 @@ private boolean getRequiresHttpcWorkaround() {
890908

891909
class ExtendedCodegenModel extends CodegenModel {
892910
public boolean hasImports;
893-
public List<CodegenProperty> primitiveVars = new ArrayList<>();
894-
public List<CodegenProperty> complexVars = new ArrayList<>();
895-
public List<CodegenProperty> requiredPrimitiveVars = new ArrayList<>();
911+
public List<CodegenProperty> ectoFields = new ArrayList<>();
912+
public List<CodegenProperty> ectoEmbeds = new ArrayList<>();
913+
public List<CodegenProperty> requiredEctoFields = new ArrayList<>();
896914

897915
public ExtendedCodegenModel(CodegenModel cm) {
898916
super();
@@ -948,13 +966,13 @@ public ExtendedCodegenModel(CodegenModel cm) {
948966
this.hasImports = !this.imports.isEmpty();
949967

950968
for (CodegenProperty var : this.vars) {
951-
if (var.isPrimitiveType) {
952-
this.primitiveVars.add(var);
969+
if (var.isPrimitiveType || var.isMap) {
970+
this.ectoFields.add(var);
953971
if (var.required) {
954-
this.requiredPrimitiveVars.add(var);
972+
this.requiredEctoFields.add(var);
955973
}
956974
} else {
957-
this.complexVars.add(var);
975+
this.ectoEmbeds.add(var);
958976
}
959977
}
960978
}

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

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,22 @@
1313
@derive {JSON.Encoder, only: [{{#vars}}{{#atom}}{{&baseName}}{{/atom}}{{^-last}}, {{/-last}}{{/vars}}]}
1414
@primary_key false
1515
embedded_schema do
16-
{{#vars}}
17-
{{#isPrimitiveType}}
16+
{{#ectoFields}}
1817
field {{#atom}}{{&baseName}}{{/atom}}, {{{ectoType}}}
19-
{{/isPrimitiveType}}
20-
{{^isPrimitiveType}}
18+
{{/ectoFields}}
19+
{{#ectoEmbeds}}
2120
{{^isArray}}embeds_one{{/isArray}}{{#isArray}}embeds_many{{/isArray}} {{#atom}}{{&baseName}}{{/atom}}, {{&moduleName}}.Model.{{^isArray}}{{{baseType}}}{{/isArray}}{{#isArray}}{{{items.baseType}}}{{/isArray}}
22-
{{/isPrimitiveType}}
23-
{{/vars}}
21+
{{/ectoEmbeds}}
2422
end
2523

2624
@spec changeset(t(), map()) :: Ecto.Changeset.t()
2725
def changeset(%__MODULE__{} = struct, params) do
2826
struct
29-
|> Ecto.Changeset.cast(params, [{{#primitiveVars}}{{#atom}}{{&baseName}}{{/atom}}{{^-last}}, {{/-last}}{{/primitiveVars}}])
30-
|> Ecto.Changeset.validate_required([{{#requiredPrimitiveVars}}{{#atom}}{{&baseName}}{{/atom}}{{^-last}}, {{/-last}}{{/requiredPrimitiveVars}}])
31-
{{#complexVars}}
27+
|> Ecto.Changeset.cast(params, [{{#ectoFields}}{{#atom}}{{&baseName}}{{/atom}}{{^-last}}, {{/-last}}{{/ectoFields}}])
28+
|> Ecto.Changeset.validate_required([{{#requiredEctoFields}}{{#atom}}{{&baseName}}{{/atom}}{{^-last}}, {{/-last}}{{/requiredEctoFields}}])
29+
{{#ectoEmbeds}}
3230
|> Ecto.Changeset.cast_embed({{#atom}}{{&baseName}}{{/atom}}{{#required}}, required: true{{/required}})
33-
{{/complexVars}}
31+
{{/ectoEmbeds}}
3432
end
3533
end
3634
{{/model}}{{/models}}

samples/client/petstore/elixir/lib/openapi_petstore/model/mixed_properties_and_additional_properties_class.ex

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,14 @@ defmodule OpenapiPetstore.Model.MixedPropertiesAndAdditionalPropertiesClass do
1818
embedded_schema do
1919
field :uuid, :string
2020
field :dateTime, :utc_datetime
21-
embeds_one :map, OpenapiPetstore.Model.map()
21+
field :map, :map
2222
end
2323

2424
@spec changeset(t(), map()) :: Ecto.Changeset.t()
2525
def changeset(%__MODULE__{} = struct, params) do
2626
struct
27-
|> Ecto.Changeset.cast(params, [:uuid, :dateTime])
27+
|> Ecto.Changeset.cast(params, [:uuid, :dateTime, :map])
2828
|> Ecto.Changeset.validate_required([])
29-
|> Ecto.Changeset.cast_embed(:map)
3029
end
3130
end
3231

samples/client/petstore/elixir/lib/openapi_petstore/model/object_with_deprecated_fields.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ defmodule OpenapiPetstore.Model.ObjectWithDeprecatedFields do
1919
embedded_schema do
2020
field :uuid, :string
2121
field :id, :float
22-
embeds_one :deprecatedRef, OpenapiPetstore.Model.DeprecatedModel
2322
field :bars, {:array, :string}
23+
embeds_one :deprecatedRef, OpenapiPetstore.Model.DeprecatedModel
2424
end
2525

2626
@spec changeset(t(), map()) :: Ecto.Changeset.t()

samples/client/petstore/elixir/lib/openapi_petstore/model/pet.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ defmodule OpenapiPetstore.Model.Pet do
2020
@primary_key false
2121
embedded_schema do
2222
field :id, :integer
23-
embeds_one :category, OpenapiPetstore.Model.Category
2423
field :name, :string
2524
field :photoUrls, {:array, :string}
26-
embeds_many :tags, OpenapiPetstore.Model.Tag
2725
field :status, :string
26+
embeds_one :category, OpenapiPetstore.Model.Category
27+
embeds_many :tags, OpenapiPetstore.Model.Tag
2828
end
2929

3030
@spec changeset(t(), map()) :: Ecto.Changeset.t()

0 commit comments

Comments
 (0)