Skip to content

Commit 583ee7a

Browse files
committed
improve integration with ecto
1 parent 7e30705 commit 583ee7a

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
}
@@ -896,9 +914,9 @@ private boolean getRequiresHttpcWorkaround() {
896914

897915
class ExtendedCodegenModel extends CodegenModel {
898916
public boolean hasImports;
899-
public List<CodegenProperty> primitiveVars = new ArrayList<>();
900-
public List<CodegenProperty> complexVars = new ArrayList<>();
901-
public List<CodegenProperty> requiredPrimitiveVars = new ArrayList<>();
917+
public List<CodegenProperty> ectoFields = new ArrayList<>();
918+
public List<CodegenProperty> ectoEmbeds = new ArrayList<>();
919+
public List<CodegenProperty> requiredEctoFields = new ArrayList<>();
902920

903921
public ExtendedCodegenModel(CodegenModel cm) {
904922
super();
@@ -954,13 +972,13 @@ public ExtendedCodegenModel(CodegenModel cm) {
954972
this.hasImports = !this.imports.isEmpty();
955973

956974
for (CodegenProperty var : this.vars) {
957-
if (var.isPrimitiveType) {
958-
this.primitiveVars.add(var);
975+
if (var.isPrimitiveType || var.isMap) {
976+
this.ectoFields.add(var);
959977
if (var.required) {
960-
this.requiredPrimitiveVars.add(var);
978+
this.requiredEctoFields.add(var);
961979
}
962980
} else {
963-
this.complexVars.add(var);
981+
this.ectoEmbeds.add(var);
964982
}
965983
}
966984
}

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)