Skip to content

Commit be52c72

Browse files
authored
Merge pull request #21 from abelino/fix/optional-list
An optional list value should return nil if the incoming raw value is nil or not present
2 parents 1d6ff68 + 73dc3de commit be52c72

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

lib/speck.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,14 @@ defmodule Speck do
142142
end)
143143

144144
case coerced_maplist do
145+
{[], []} ->
146+
value =
147+
if opts[:optional] && is_nil(get_raw_value(value, name)),
148+
do: nil,
149+
else: []
150+
151+
{Map.put(fields, name, value), errors}
152+
145153
{value, []} ->
146154
{Map.put(fields, name, value), errors}
147155

protocol/test/optional_map_list.ex

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
struct TestSchema.OptionalMapList
2+
3+
name "optional_map_list"
4+
5+
attribute :status, :atom, values: [:pending, :failed]
6+
7+
attribute [:transactions], optional: true do
8+
attribute :id, :integer
9+
attribute :amount, :integer
10+
end

test/speck_test.exs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,18 @@ defmodule Speck.Test do
126126
}}
127127
end
128128

129+
test "return nil if optional list is not present" do
130+
params = %{
131+
"status" => "failed",
132+
}
133+
134+
assert Speck.validate(TestSchema.OptionalMapList, params) ==
135+
{:ok, %TestSchema.OptionalMapList{
136+
status: :failed,
137+
transactions: nil,
138+
}}
139+
end
140+
129141
test "returns errors if a list can't be coerced" do
130142
params = %{
131143
"device_ids" => [-3, 0, 4, 19]

0 commit comments

Comments
 (0)