Packages
cqrs_tools
0.5.6
0.5.28
0.5.27
0.5.26
0.5.25
0.5.24
0.5.23
0.5.22
0.5.21
0.5.20
0.5.19
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.30
0.2.29
0.2.28
0.2.27
0.2.26
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.1
0.1.0
A collection of handy Elixir macros for CQRS applications.
Current section
Files
Jump to
Current section
Files
lib/cqrs/input.ex
defmodule Cqrs.Input do
@moduledoc false
alias Cqrs.InvalidValuesError
def normalize_input(input, mod) do
mod
|> normalize(input)
|> string_keys()
|> destruct()
|> populate_from_sources(mod)
end
defp destruct(list) when is_list(list), do: Enum.map(list, &destruct/1)
defp destruct(map) when is_map(map) do
Enum.into(map, %{}, fn
{key, value} when is_struct(key) -> {key, destruct(Map.from_struct(value))}
{key, value} -> {key, value}
end)
end
defp destruct(other), do: other
defp normalize(_mod, input) when is_list(input), do: Enum.into(input, %{})
defp normalize(_mod, input) when is_struct(input), do: Map.from_struct(input)
defp normalize(_mod, input) when is_map(input), do: input
defp normalize(mod, _other), do: raise(InvalidValuesError, module: mod)
defp string_keys(input) do
for {key, value} <- input, into: %{} do
{to_string(key), value}
end
end
defp populate_from_sources(input, mod) do
Enum.reduce(mod.__schema__(:fields), input, fn field, acc ->
field_source = mod.__schema__(:field_source, field)
source_value = Map.get(input, field_source)
acc =
if source_value do
Map.update(acc, to_string(field), source_value, fn
nil -> source_value
other -> other
end)
else
acc
end
Map.delete(acc, field_source)
end)
end
end