Skip to content

Commit fec105b

Browse files
committed
nullable maps with nested models
1 parent 9670520 commit fec105b

File tree

2 files changed

+44
-36
lines changed

2 files changed

+44
-36
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,33 @@
11
{{>licenseInfo}}
22
defmodule {{moduleName}}.EctoUtils do
33
def cast_nested_map(changeset, field, schema) do
4-
values = Map.get(changeset.changes, field) || %{}
4+
case Map.get(changeset.changes, field) do
5+
nil ->
6+
changeset
57

6-
{result_map, errors} =
7-
Enum.reduce(values, {%{}, []}, fn {key, params}, {acc, errs} ->
8-
changeset = schema.changeset(struct(schema), params)
8+
values ->
9+
{result_map, errors} =
10+
Enum.reduce(values, {%{}, []}, fn {key, params}, {acc, errs} ->
11+
changeset = schema.changeset(struct(schema), params)
912

10-
case Ecto.Changeset.apply_action(changeset, changeset.action || :insert) do
11-
{:ok, struct} ->
12-
{Map.put(acc, key, struct), errs}
13+
case Ecto.Changeset.apply_action(changeset, changeset.action || :insert) do
14+
{:ok, struct} ->
15+
{Map.put(acc, key, struct), errs}
1316

14-
{:error, nested_cs} ->
15-
{Map.put(acc, key, nested_cs), [{key, nested_cs} | errs]}
16-
end
17-
end)
17+
{:error, nested_cs} ->
18+
{Map.put(acc, key, nested_cs), [{key, nested_cs} | errs]}
19+
end
20+
end)
1821

19-
changeset =
20-
Ecto.Changeset.put_change(changeset, field, result_map)
22+
changeset =
23+
Ecto.Changeset.put_change(changeset, field, result_map)
2124

22-
if errors == [] do
23-
changeset
24-
else
25-
Ecto.Changeset.add_error(changeset, field, "contains invalid nested entries")
26-
|> Map.put(:valid?, false)
25+
if errors == [] do
26+
changeset
27+
else
28+
Ecto.Changeset.add_error(changeset, field, "contains invalid nested entries")
29+
|> Map.put(:valid?, false)
30+
end
2731
end
2832
end
2933
end

samples/client/petstore/elixir/lib/openapi_petstore/ecto_utils.ex

+22-18
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,33 @@
33

44
defmodule OpenapiPetstore.EctoUtils do
55
def cast_nested_map(changeset, field, schema) do
6-
values = Map.get(changeset.changes, field) || %{}
6+
case Map.get(changeset.changes, field) do
7+
nil ->
8+
changeset
79

8-
{result_map, errors} =
9-
Enum.reduce(values, {%{}, []}, fn {key, params}, {acc, errs} ->
10-
changeset = schema.changeset(struct(schema), params)
10+
values ->
11+
{result_map, errors} =
12+
Enum.reduce(values, {%{}, []}, fn {key, params}, {acc, errs} ->
13+
changeset = schema.changeset(struct(schema), params)
1114

12-
case Ecto.Changeset.apply_action(changeset, changeset.action || :insert) do
13-
{:ok, struct} ->
14-
{Map.put(acc, key, struct), errs}
15+
case Ecto.Changeset.apply_action(changeset, changeset.action || :insert) do
16+
{:ok, struct} ->
17+
{Map.put(acc, key, struct), errs}
1518

16-
{:error, nested_cs} ->
17-
{Map.put(acc, key, nested_cs), [{key, nested_cs} | errs]}
18-
end
19-
end)
19+
{:error, nested_cs} ->
20+
{Map.put(acc, key, nested_cs), [{key, nested_cs} | errs]}
21+
end
22+
end)
2023

21-
changeset =
22-
Ecto.Changeset.put_change(changeset, field, result_map)
24+
changeset =
25+
Ecto.Changeset.put_change(changeset, field, result_map)
2326

24-
if errors == [] do
25-
changeset
26-
else
27-
Ecto.Changeset.add_error(changeset, field, "contains invalid nested entries")
28-
|> Map.put(:valid?, false)
27+
if errors == [] do
28+
changeset
29+
else
30+
Ecto.Changeset.add_error(changeset, field, "contains invalid nested entries")
31+
|> Map.put(:valid?, false)
32+
end
2933
end
3034
end
3135
end

0 commit comments

Comments
 (0)