Packages
maru
0.10.2
0.14.0-pre.1
0.13.2
0.13.1
0.13.0
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.1
0.4.0
0.3.1
0.3.0
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
REST-like API micro-framework for elixir inspired by grape.
Current section
Files
Jump to
Current section
Files
lib/maru/runtime.ex
defmodule Maru.Runtime do
@moduledoc false
alias Maru.Struct.Parameter.Runtime, as: PR
alias Maru.Struct.Validator.Runtime, as: VR
@doc """
parse params from `conn.params`.
"""
def parse_params([], result, _), do: result
def parse_params([%VR{validate_func: func} | t], result, conn_params) do
func.(result)
parse_params(t, result, conn_params)
end
def parse_params([%PR{attr_name: attr_name}=h | t], result, conn_params) do
result =
conn_params
|> Map.get(h.param_key)
|> case do
nil -> h.nil_func.(result)
value ->
value = do_parse(h.parser_func, value, attr_name)
h.validate_func.(value)
value = do_nested(h.nested, h.children, value)
put_in(result, [h.attr_name], value)
end
parse_params(t, result, conn_params)
end
defp do_parse(func, value, attr_name) do
try do
func.(value)
rescue
_ ->
Maru.Exceptions.InvalidFormatter
|> raise([reason: :illegal, param: attr_name, value: value])
end
end
defp do_nested(nil, _, value), do: value
defp do_nested(:map, children, value) do
parse_params(children, %{}, value)
end
defp do_nested(:list, children, value) do
Enum.map(value, &parse_params(children, %{}, &1))
end
end