defimpl Altstd.Compact, for: Map do @moduledoc since: "0.1.0" @doc since: "0.1.0" @spec resolve(map(), keyword) :: Altstd.Compact.resolution_t() def resolve(object, opts \\ []) def resolve(object, _opts) when map_size(object) == 0 do {:reject, object} end def resolve(object, opts) do compact_map = object |> Enum.reduce(%{}, fn {key, value}, acc -> resolution = value |> Altstd.Compact.resolve(opts) case resolution do {:resolve, resolved_value} -> acc |> Map.put(key, resolved_value) {:reject, _any} -> acc :reject -> acc resolved_value -> acc |> Map.put(key, resolved_value) end end) case map_size(compact_map) do 0 -> {:reject, object} _any -> {:resolve, compact_map} end end @doc since: "0.1.0" @spec cast(map(), keyword) :: Altstd.Compact.t() def cast(object, opts \\ []) do resolution = object |> Altstd.Compact.resolve(opts) case resolution do {:resolve, resolved_value} -> resolved_value |> List.wrap() {:reject, _any} -> [] :reject -> [] resolved_value -> resolved_value |> List.wrap() end end end