defmodule Maru.Params.Runtime do
defstruct name: nil,
required: false,
source: nil,
nested: nil,
children: [],
blank_func: nil,
parser_func: nil,
validate_func: nil
def parse_params(params_runtime, params) do
parse_params(params_runtime, params, %{})
end
def parse_params([], _params, result), do: result
def parse_params([h | t], params, result) do
passed? = Map.has_key?(params, h.source)
value = Map.get(params, h.source)
nested = h.nested
parsed =
if value in [nil, "", '', %{}] do
h.blank_func.({value, passed?})
else
h.parser_func.({:ok, value})
end
case parsed do
:ignore ->
parse_params(t, params, result)
{:error, step, reason} ->
raise "Params Parse Error: #{step}, #{reason}"
{:ok, value} when nested == :map ->
value = parse_params(h.children, value, %{})
parse_params(t, params, Map.put(result, h.name, value))
{:ok, value} when nested == :list_of_map ->
value = Enum.map(value, fn item -> parse_params(h.children, item, %{}) end)
parse_params(t, params, Map.put(result, h.name, value))
{:ok, value} when nested == :list_of_single ->
value =
Enum.map(value, fn
{:ok, item} -> item
{:error, step, reason} -> raise "Params Parse Error: #{step}, #{reason}"
end)
parse_params(t, params, Map.put(result, h.name, value))
{:ok, value} when nested == nil ->
parse_params(t, params, Map.put(result, h.name, value))
end
end
end