From 7bb730754d920de7e82aa42f1e0eb821821cdd29 Mon Sep 17 00:00:00 2001 From: Ben Murphy Date: Mon, 21 Apr 2025 16:15:53 -0400 Subject: [PATCH] Optional Enumerables do not create empty instances when omitted --- lib/speck.ex | 24 +++++++++++++++--------- test/speck_test.exs | 9 +-------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/lib/speck.ex b/lib/speck.ex index 6534b2e..6e1ff4c 100644 --- a/lib/speck.ex +++ b/lib/speck.ex @@ -25,15 +25,6 @@ defmodule Speck do !is_nil(opts[:default]) && is_nil(raw_value) -> {Map.put(fields, name, opts[:default]), errors} - type == :map -> - case do_validate(type, raw_value, opts, attributes) do - {value, map_errors} when map_errors == %{} -> - {Map.put(fields, name, value), errors} - - {value, map_errors} -> - {Map.put(fields, name, value), Map.put(errors, name, map_errors)} - end - opts[:optional] && is_nil(raw_value) && type == :boolean -> {Map.put(fields, name, false), errors} @@ -43,6 +34,15 @@ defmodule Speck do opts[:optional] && is_nil(raw_value) -> {fields, errors} + type == :map -> + case do_validate(type, raw_value, opts, attributes) do + {value, map_errors} when map_errors == %{} -> + {Map.put(fields, name, value), errors} + + {value, map_errors} -> + {Map.put(fields, name, value), Map.put(errors, name, map_errors)} + end + is_list(type) -> raw_value |> Enum.with_index @@ -142,6 +142,12 @@ defmodule Speck do end) case coerced_maplist do + {[], []} -> + {fields, errors} + + {[], error} -> + {fields, Map.put(errors, name, error)} + {value, []} -> {Map.put(fields, name, value), errors} diff --git a/test/speck_test.exs b/test/speck_test.exs index 4aa2971..43663a3 100644 --- a/test/speck_test.exs +++ b/test/speck_test.exs @@ -79,14 +79,7 @@ defmodule Speck.Test do rs485_address: :not_present, serial_number: :not_present, dns_servers: :not_present, - metadata: %{ - location: :not_present, - department: :not_present, - commissioned_at: :not_present, - ports: %{ - rs485: :not_present, - } - } + metadata: :not_present }} end